一、String类
1.字符串对象
String str = new String("hello");
String对象是final修饰的,不可修改的,修改后的字符串对象是另外一个对象,只是修改了引用地址。每次创建都会创建一个新的对象。
2. 字面量
String s = "hello";
存储在方法区常量池中,只有1份。
3. 创建方式
①new String(“abc”);
②String str = “abc”;
③char[] chs = {‘a’, ‘b’, ‘c’};
④String(char[] chs);
⑤String(char[] value, int offset, int count);
⑥String(byte[] bytes);
⑦String(byte[] bytes, String charsetName);//按编码格式转换
⑧String str = “” + 任何类型;对象会调用toString()方法
二、String的常用方法
1. 基本操作
函数名 | 作用 |
---|---|
isEmpty() | 字符是否为空 |
length | 返回字符的个数 |
concat() | 拼接字符串,等价于+ |
equals() | 比较两个字符串是否相等 |
equalsIgnoreCase() | 忽略大小写比较大小 |
compareTo() | 返回int, 正数大于,负数小于,0相等 |
compareToIgnoreCase() | 忽略大小写 |
toLowerCase() | 转换为小写字母 |
toUpperCase() | 转换为大写字母 |
trim() | 去掉字符串前后空白符 |
2. 查找
函数名 | 作用 |
---|---|
contains(String str) | 是否包含另一个字符串str |
indexOf(String str) | 查找另一个字符串第一次出现的位置 |
lastIndexOf(String str) | 查找另一个字符串最后 出现的位置 |
indexOf(String str, int from) | 从某个位置开始查找另一个字符串第一次出现的位置 |
3. 字符串截取
函数名 | 作用 |
---|---|
subString(int begin) | 从begin开始截取一个字符串 |
subString(int begin, int end) | 按区间截取,左闭右开 |
lastIndexOf(String str) | 查找另一个字符串最后 出现的位置 |
indexOf(String str, int from) | 从某个位置开始查找另一个字符串第一次出现的位置 |
4. 字符相关
函数名 | 作用 |
---|---|
charAt() | 获取字符串相应位置的字母 |
toCharArray() | 将字符串转换为一个新的字符串数组 |
String(char[] value) | 将字符串数组转换为字符串 |
String(char[] chs, int offset, int count) | 从某个位置开始转换为字符串返回 |
copyValueOf(char[] data) | 静态方法,字符数组变字符串 |
copyValueOf(char[] data, int offset, int count) | 将部分数组转换为字符串 |
5. 编码与解码
函数名 | 作用 |
---|---|
getBytes() | 编码:把字符串变成字节数组 |
getBytes(编码方式) | 编码:按编码格式进行转换 |
String(byte[] bytes) | 解码:把字节数组转换为字符串 |
String(byte[] bytes, String codingSet) | 解码:按指定格式进行解码 |
6. 字符串格式匹配(正则)
函数名 | 作用 |
---|---|
startWith(String str) | 是否以str开头 |
endWith(String str) | 是否以str结尾 |
matches(String regex) | 使用正则表达式验证字符串 |
正则表达式 | 含义 |
---|---|
[0-9] | 表示0到9之间的任意一个数值 |
\d | 数字 |
\D | 非数值 |
\w | 字符 |
\W | 非字符 |
+ | 出现1次或多次 |
? | 1次或0次 |
* | 任意次 |
{ n } | 出现n次 |
{5,10} | 5到10次 |
{5,} | 至少5次 |
7. 替换与拆分
函数名 | 作用 |
---|---|
replace(String str, String str2) | 将字符串中的str替换成str2 |
replaceFirst(String 正则, value) | 替换第一个匹配部分的字符串 |
replaceAll(String regex, value) | 替换所有匹配部分 |
split(String regex) | 按照某种规则进行拆分,支持正则 |
注: “abc”拆分为“a”, “b”,“c” = s.split(“|”)
三、字符串的内存
1. 内存分析
考察例题:
解析:
只有两个字面常量使用加号连接,编译器自动优化为一个字母量,其余情况都会创建一个新的对象。
String变量加final修饰时就可以当做字面常量,编译器也会自动优化,不会创建新的对象。
这个是编译后的字节码文件,参考底层代码可以看到一些我们无法发现的细节。
2. intern方法
用来检查该字符串常量在字符串常量池中是否有该字符串常量, 有的话直接返回该字符串, JDK8之后,没有的话将自己的引用放进去后再返回一个字符串,没有创建新的字符串对象。JDK6之前,如果没有的话,在字符串常量池中创建一个副本并返回。
String s = "hello";
String intern = s.intern();
//这句代码在堆中和字符串常量池中都创建了对象
String s = new String("hello");
String intern = s.intern();
四、StringBuffer和StringBuilder
1. 与String的区别
需要频繁修改字符串时,可以使用可变长字符串。该类型字符串修改时不需要创建新的字符串对象。StringBuffer是线程安全的,StringBuilder是线程不安全的。
2. 常用方法
①append(String str): 拼接字符串,返回值还是StringBuilder自己本身。
②reverse(): 字符串反转。
③toString(): 返回一个String对象。
④new StringBuilder(str): 将字符串转换为StringBuilder对象。