StringBuffer类和StringBuilder类
三者比较
String
- 不可变字符序列
- 底层用char[]存储
StringBuffer
- 可变的字符序列
- 线程安全的
- 效率低
- 底层结构使用char[]存储
- 扩容问题
- 如果要添加的底层数组盛不下,需要扩容底层的数组
- 默认情况下扩容为原来容量的2倍 + 2 ,同时将原有的数组元素复制到新的数组中
StringBuilder
- 可变的字符序列
- 线程不安全
- 效率高
- 源码分析
- 和StringBuffer源码一样,只是线程不安全了而已
三者效率比较
StringBuilder > StringBuffer > String
StringBuffer类
分析
- StringBuffer stringBuffer = new StringBuffer();
- 在底层创建了一个长度为16的数组:
char[] value = new char[16]
-
添加数据后:
stringBuffer.append(‘a’);
- 其底层为:value[0] = ‘a’;
- 在底层创建了一个长度为16的数组:
- StringBuffer stringBuffer = new StringBuffer(“abc”);
此时底层:
char[] value = new char[”abc”.length + 16]
底层代码如图
常用方法
- str1.append():用于字符串拼接
-
str1.delete(start,end):删除指定位置的内容(被删除的内容左闭右开)
-
str1.replace(start,end,str):把[start,end]位置替换成str(左闭右开)
之前的str1为“abc11”
-
str1.insert(offset,b):在指定位置插入XXX(插入不是替换,只是位置后移)
之前的str1为“abc11”
-
str1.reverse():当前字符串序列逆转
之前的str1为“abc11”
- str1.indexOf(str):返回str在当前字符串首次出现的位置
-
str1.substring(start, end):返回从strat开始到end索引结束的左闭右开区间的子字符串
之前的str1为“abc11”
StringBuilder类
- 底层源码和StringBuffer源码一样,只是线程不安全了而已
-
常用的方法与StringBuffer相同,String一些方法也可以使用(可总结为增删改查插)
- 增
append(XXX)
-
删
delect(int start,int end)
-
改
setCharAt(int n,char ch)——–修改一个字符
replace(int start,int end,String str)——-修改换成一个新的字符串
-
查
charAt(int n)
-
插
insert(int offset,XXX)
-
长度
length
- 增
StringBuilder(StringBuffer)与String之间的数据转换
StringBuilder/StringBuffer—->String转换
-
toString()方法
-
通过String类中的构造将一个StringBuffer类转换为String类
String—->StringBuilder/StringBuffer转换
- 利用构造函数
- 调用append方法