12 String类概述和使用

117 阅读5分钟

1 String类

  • java.lang.String类用于描述字符串,java程序中所有字符串字面值都可以由String类描述。
  • String类由于被final关键字修饰,所以该类不能被继承
  • 从jdk1.9开始String类底层实现不使用char[]来存储数据,而是改成使用byte[]加上编码标记,这样可以节约一些空间
  • String类描述的字符串是不可变的常量,只能被共享

String类的构造方法:

方法声明功能介绍
String()无参方式构造对象得到空字符串
String( byte[] bytes , int offset , int length )使用bytes数组中下标从offset开始的length个字节来构造对象
String( byte[] bytes )使用bytes数组中所有内容来构造对象
String( char[] values , int offset , int length )使用values数组中下标从offset开始的length个字符来构造对象
String( char[] values )使用values数组中所有内容来构造对象
String(String str )根据参数指定的字符串内容来构造对象,新创建对象为参数对象的副本

String类常用成员方法:

方法声明功能介绍
String toString()返回字符串本身
byte[] getBytes()将当前字符串内容转换为byte数组并返回
char[] toCharArray()将当前字符串内容转换为char数组并返回
char charAt(int index)获取字符串中参数指定位置的字符并返回
int length()返回字符串的长度
boolean isEmpty()判断字符串是否为空
int compareTo( String s )比较调用对象和参数对象的大小关系
int compareToIgnoreCase( String s )比较调用对象和参数对象的大写关系,但忽略大小写
String contact( String s )实现字符串的拼接
boolean contains( CharSequence s )判断当前字符串中是否包含参数指定的字符序列
String toLowerCase()返回字符串小写形式
String toUpperCase()返回字符串大写形式
String trim()返回去掉前导和后继空白的字符串
boolean startsWith( String pre )判断字符串是否已参数指定的字符串开头
boolean startsWith( String pre ,int offset )判断字符串从指定位置开始是否以参数字符串开头
boolean endWith( String suff )判断字符串是否以参数字符串结尾
boolean equals( Object obj )比较字符串内容是否相等并返回结果
int hashCode()返回字符串的哈希码值
boolean equalsIgnoreCase( String s )比较两个字符串内容是否相等,不考虑大小写

2 常量池

由于String类描述的字符串内容是不可变的,因此java虚拟机将首次出现的字符串放入常量池中,若后续代码中出现相同的字符串内容则直接从常量池中拿,而不需要再申请内存空间及创建对象,从而提高了性能。

3 正则表达式

正则表达式本质上是一个“规则字符串”,用于对字符串格式进行校验,以及匹配、查找、替换等操作。该字符串通常使用^运算符作为开头标志,用$作为结尾标志,当然也可以省略前后标志。

正则表达式具体规则:

正则表达式说明
[abc]可以出现a、b、c中任意一个
[^abc]可以出现除a、b、c以外的任意字符
[a-z]可以出现从a到z之中的任意一个字符
[a-zA-Z0-9]可以出现a-z、0-9、A-Z中任意一个字符
.任意一个字符(不包括换行符)
\d任意一个数字字符,相当于[0-9]
\D任意一个非数字字符
\s空白字符,相当于[\t\n\x0B\f\r]
\S非空白字符
\w任意一个单词字符,相当于[a-zA-Z0-9]
\W任意一个非单词字符
X?表示X可以出现一次或一次也没有,也就是0~1次
X*表示X可以出现零次或多次,也就是0~n次
X+表示X可以出现一次或多次,也就是1~n次
X{n}表示X可以出现n次
X{ n, }表示X至少出现n次
X{n,m}表示X至少出现n次,但不超过m次

4 String笔试考点

  1. 使用两种方式实现字符串“12345”转换为整数12345并打印

第一种是使用Integer的parseInt()方法,具体代码如下:

 String str3=new String("12345");
 int res=Integer.parseInt(str3);
 System.out.println("转换后的整数是"+res);

第二种是利用ASCII来实现,具体代码如下:

String str3=new String("12345");
int ib=0;
byte[] b=str3.getBytes();
for(int i=0;i<b.length;i++){
       ib=ib*10+(b[i]-'0');
   }
System.out.println("转换后的整数是"+ib);
  1. 请问下面代码会创建几个对象?并存放在什么地方?
   String str1="hello";
   String str2=new String("helo");
		

上面代码中str1处会创建1个对象,并将字符串放入常量池中;str2处会创建两个对象,一个放在常量池中,一个放入堆区

  1. 给出下列代码的输出结果
   String str1="hello";
	 String str2="hello";
   String str3=new String("heloo");
   String str4=new String("heloo");
   System.out.println(str1==str2);
	 System.out.println(str1.equals(str2));
   System.out.println(str3==str4);
	 System.out.println(str3.equals(str4));
   System.out.println(str2==str4);
	 System.out.println(str2.equals(str4));

对应的输出结果是:true true false true false true

  1. 常量优化机制
           String str5="abcd";
           String str6="ab"+"cd";
           System.out.println(str5==str6);
           String str7="ab";
           String str8=str7+"cd";
           System.out.println(str5==str8);

上面代码输出结果是:true和false,原因是常量优化机制只适用于常量,对于变量来说是无效的,所以str6中两个常量拼接后结果为"abcd",是在常量池中已存在的,故str6和str5的地址相同,而str7虽然从结果上来看也是"abcd",但是由于str7是变量,并不能适用常量优化机制,则str8最终还是会新创建一个"abcd"的对象,从而与str5的地址不同