首页 > 代码库 > 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