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笔试考点
- 使用两种方式实现字符串“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);
- 请问下面代码会创建几个对象?并存放在什么地方?
String str1="hello";
String str2=new String("helo");
上面代码中str1处会创建1个对象,并将字符串放入常量池中;str2处会创建两个对象,一个放在常量池中,一个放入堆区
- 给出下列代码的输出结果
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
- 常量优化机制
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的地址不同