String类
- String不是基本数据类型,底层数据结构是 final修饰的char数组;
- String是不可变字符串,一旦定义,无法再修改,每次赋值都是一个新的String对象;
- String拼接(+操作):原理是在堆上new了一个与原字符串相同的StringBuilder对象,然后再调用append方法拼接 +后面的字符串;
- 使用场景:少量字符串操作
StringBuilder类
- 数据结构:char数组
- 可变字符串
- 非线程安全
- 默认容量16,扩容时仍会重新申请内存空间
- 使用场景:单线程下在字符缓冲区进行大量操作的情况
线程不安全的原因: append方法使用了父类AbstractStringBuilder.append()的实现
count += len; 是非原子操作,在多线程环境下,会出现线程安全问题;
StringBuffer类
- 数据结构:char数组
- 可变字符串
- 线程安全,大多数方法使用synchronized进行修饰
- 默认容量16,扩容时仍会重新申请内存空间
- 使用场景:多线程下大量操作字符串的情况
相同点:
- 都用于字符串操作场景(字符串数组)
- 都是final类(不可继承)
不同点:
- String长度不可变,线程不安全
- StringBuilder长度可变,线程不安全
- StringBuffer长度可变,线程安全
- String重写equal方法,比较的是字符串的内容;StringBuilder和StringBuffer比较的是对象地址