首页 > 代码库 > String

String

String是Java中最常用的存储字符型数据的类,被final修饰,无法被继承且字符串长度无法修改,维护在常量池中(常量池属于方法区的一部分)。

1. 初始化方式

String主要有两种初始化方式

  1)String str = "abc";

这是一种最基本的初始化方式,过程如下:

① 首先在常量池中查找是否存在abc的字符串对象

② 若不存在则在常量池中创建abc字符串对象,并让引用指向该对象

③ 若存在则直接让引用指向该对象

  2)String str = new String("abc");

① 首先在堆中创建一个abc字符串对象,并让引用指向该对象

② 查找常量池中是否存在abc字符串对象

③ 若存在,则将堆中的abc字符串对象和常量池的abc字符串对象关联起来

④ 若不存在,则在常量池中创建一个,并与堆中abc字符串对象关联起来

这里经常会有面试题问道:String str = new String("abc"); 总共创建了几个对象?

通过上面分析应该知道,得先看常量池中有没有abc,若有则创建一个,若没有则两个。

2. 常用API

boolean equals(String str); // 比较字符串是否相同,区分大小写boolean equalsIgnore(String str); // 比较字符串是否相同,不区分大小写String toLowerCase(); // 字符串的字符全部变成小写String toUpperCase(); // 字符串的字符全部变成大写String trim(); // 去除字符串两边的空格(包括\n等特殊符号)boolean startsWith(String str); // 判断字符串是否以str开头boolean startsWith(String str, int from); // 判断字符串是否以str开头,从下标from开始int length(); // 计算字符串长度int indexOf(String str); // 返回字符串中第一次出现str的位置,不存在返回-1int indexOf(String str, int from); // 返回字符串中第一次出现str的位置,从下标from开始,不存在返回-1int lastIndexOf(String str); // 返回字符串中最后一次出现str的位置,不存在返回-1char charAt(int index); // 返回字符串下标index位置的字符String substring(int start, int end); // 截取下标start到end位置的字符串,不含endString substring(int start); // 截取下标start到最后位置的字符串String[] split(String rex); // 用给定正则表达式拆分字符串,返回拆分后的数组  // 如果字符串末尾拆分出来的都是空字符串,则会全部去除,例"a@b@@@",以@做分隔符,拆分结果[a, b],后面多余的空字符串全部移除String[] split(String rex, int limit); // 用给定正则表达式拆分字符串,限制拆分为limit项,返回拆分后的数组	// ① 若limit < 0 || limit >= 拆分结果总项,则保留空字符串,例"a@b@@",假设limit为-1或5,则拆分结果为[a, b, , ]	// ② 若limit > 0 && limit < 拆分结果总项,假设limit为2,则拆分结果为[a, b@@]String replace(String old, String new); // 将字符串中的old全部替换成newString replace(char old, char new); // 同上,只不过替换字符String replaceAll(String rex, String new); // 替换所有满足正则的子串String replaceFirst(String rex, String new); // 替换第一个满足正则的子串boolean matches(String rex); // 判断是否满足正则char[] toCharArray(); // 转换为字符数组byte[] getBytes(String charsetName); // 使用指定编码转成字节数组

3. StringBuffer/StringBuilder

可变长字符串,一般用于频繁操作字符串的场景下,避免不停创建字符串导致常量池内存溢出。

StringBuffer和StringBuilder的API完全相同,但StringBuffer线程安全,StringBuilder线程不安全,StringBuffer性能比StringBuilder会差一些。

相关API和String非常类似,比如substring,indexOf等都是有的,不重复列举,以下是不同部分

StringBuffer append(str); // 追加strStringBuffer delete(int start, int end); // 删除start到end部分,不含endStringBuffer replace(int start, int end, String new); // 将start到end位置子串替换成newStringBuffer insert(int index, String str); // 在下标index位置插入str,其他字符向后移位StringBuffer reverse(); // 反转字符串String toString(); // 转换成字符串

4. 总结

字符串操作并不难,掌握常用API基本能得心应手,还有一些第三方的jar包封装了更强大的字符串操作功能,需要时再去了解即可。

一般情况下建议使用StringBuffer/StringBuilder来处理字符串,一方面是能够节约内存,另一方面是培养良好的编程习惯,最大程度的在代码层面优化。

我们去查看一些开源框架源码或者JDK的时候,往往底层复杂的字符串操作都是使用StringBuffer/StringBuilder去处理,很少使用直接的字符串相加。

String