1. StringBuffer
类
说明: StringBuffer
代表可变的字符序列,可以对字符串内容进行增删。
StringBuffer
是可变长度StringBuffer
原码解读:StringBuffer
的直接父类是AbstractStringBuilder
StringBuffer
实现了Serializable
,即StringBuffer
的对象可以串行化- 在父类中
AbstractStringBuffer
有属性 char[] value, 不是final - 该value数组存放字符串内容,引出存放在堆中的数据
StringBuffer
是一个 final类,不能被继承- 因为
StrngBuffer
字符内容是存在char[] value,所以在变化时,不用每次都更换地址(即创建新的对象),效率高于String。
- String 和
StringBuffer
-
String 保存的是字符串常量,里面的值不能修改,每次String类的更新实际上是更改地址,效率较低。
private final char value[]
-
StringBuffer
保存的是字符串变量,里面的值可以修改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率更高。char[] value
-
StringBuffer
构造器StringBuffer stringbuffer = new StringBuffer(); //创建一个长度为16的 char[] 数组,用于存放字符内容 StringBuffer s = new StringBuffer(100); //创建一个长度为100 的char[]数组 StringBuffer s1 = new StringBuffer("hello"); //构造一个字符串缓冲区,并将其内容初始化为指定字符串内容 hello+16个
-
String 和
StringBuffer
相互转换-
String转
StringBuffer
://1.使用构造器 String str="hello"; StringBuffer stringbuffer=new StringBuffer(str); //2. 使用append方法 StringBuffer s2=new StringBuffer(); StringBuffer append=S2.append(str);
-
StringBuffer
转 String//1.toString方法 StringBuffer s3=new StringBuffer("hhh"); String s=S3.toString(); //使用构造器 String ss=new String(S3);
-
-
常用方法
- append 追加,增,返回StringBuffer
- delete 删除 delete(11,14) 删除11-14 的字符 [ )
- replace(9,11," sdd"); 位置替换
- indexof() 返回位置
- insert(9,“sds”); 从索引9位置插入数据,其余数据后移
- length() 长度
-
空对象创建StringBuffer后长度为 4 null 的长度
2. StringBuilder
类
说明: 一个可变的字符序列。 此类提供一个与StringBuffer兼容的API,但不保证同步,该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为大多数实现中,要比StringBuffer更快。
-
StringBuilder
原码解读:StringBuilder
的直接父类是AbstractStringBuilder
StringBuilder
实现了Serializable
,即StringBuffer
的对象可以串行化- 在父类中
AbstractStringBuffer
有属性 char[] value, 不是final - 该value数组存放字符串内容,引出存放在堆中的数据
StringBuilder
是一个 final类,不能被继承- 因为
StrngBuilder
字符内容是存在char[] value,所以在变化时,不用每次都更换地址(即创建新的对象),效率高于String。 StringBuilder
的方法,没有做互斥处理,即没有 synchronized 关键字,因此在单线程的情况下使用
-
String
StringBuffer
StringBuilder
比较-
StringBuffer
StringBuilder
非常类似,均代表可变的字符序列,而且方法也一样。 -
String 不可变字符序列,效率低,但是复用率高。(在常量池中相同的数据,指向相同的地址)
-
StringBuffer :可变字符序列,效率较高(增删) 线程安全
-
StringBuilder: 可变字符序列,效率较高,线程不安全
-
如果需要执行多次改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。极大影响性能。==》
如果我们对String做大量修改,不要使用String
-
效率: StringBuilder > StringBuffer > String
-
-
使用场景:
- 如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
- 如果字符串存在大量的修改操作,并在单线程的情况下,使用StringBuilder
- 如果字符串存在大量的修改操作,并在单线程的情况下,使用StringBuffer
- 如果我们字符串很少修改,被多个对象引用,使用String