一、可变性
- String使用 final关键字修饰(char或byte)数组,所以 String是不可变的
JDK8采用char数组:private final char value[]
JDK9采用byte数组:private final byte[] value
- StringBuilder与 StringBuffer都继承自 AbstractStringBuilder父类,在
AbstractStringBuilder中使用char[]value字符数组保存字符串,但是没有用 final关键字修饰,所以 StringBuilder与 StringBuffer都是可变的;
public final class StringBuffer extends AbstractStringBuilder
public final class StringBuilder extends AbstractStringBuilder
二、性能
- 每次对String类型进行修改时,都会生成一个新的String对象,性能和内有 开销都比较大;
- StringBuffer和StringBuilder的操作是直接改变字符串对象本身,而不是生成新的对象,所以性能开销小
三、如何选择使用
- 字符串少量修改:适用 String
- 单线程频繁修改字符串:适用 StringBuilder
- 多线程频繁修改字符串:适用 StringBuffer
四、StringBuilder的用法
-
出现时间
-
StringBuilder 最早出现在JDK1.5,StringBuffer 最早出现在JDK1.0。
-
性能
-
StringBuilder相比StringBuffer的性能略高(15%~30%),StringBuffer对操作方法加了(synchronize同步锁)牺牲了性能,以时间来换取安全。而StringBuilder则没有没有加锁,从而性能略高于StringBuffer。
-
用法
StringBuilder对象的创建
1.常规创建
StringBuilder sb = new StringBuilder();
2.在创建时添加初始字符串
StringBuilder sb = new StringBuilder("ABC");
3.在创建时添加初始长度
StringBuilder sb = new StringBuilder(10);
- > 注意:如果在StringBuilder创建对象时未指定长度,会自动生成一个16位的字符数组
StringBuilder方法
1. append()
作用:追加数据
StringBuilder sb = new StringBuilder("ABC");
// 追加
sb.append("just");
2. insert()
作用:向指定位置插入
sb.insert(0, "sos"); //插入位置为0,相当于添加至字符串的头部
sb.insert(5, "H"); //插入位置为5
3.deleteCharAt
作用:删除指定位置的数据
sb.deleteCharAt(3); //删除下标位置为3的字符
4.delete()
作用:删除指定范围的数据(左闭右开)
sb.delete(0, 3); //删除0-3之间的所有字符
sb.delete(3, 7); //删除3-7之间的所有字符
5.toString()
作用:将对象中的数据以字符串的形式返回
String str = sb.toString();
6.reverse()
作用:数据反转`
sb.reverse();
以上就是String,StringBuffer,StringBuilder之间的区别,以及StringBuffer,StringBuilder之间的区别和StringBuffer的一些常用方法。如有错误,请多指教