1. 可变性
String类:
字符串是常量,它们的值在创建后不能更改;字符串的底层是一个被 final 修饰的数组,不能改变,是一个常量:
private final byte[] value;
StringBuilder类:
字符串缓冲区,可以提高字符串的操作效率【看成一个长度可以变化的字符串】,底层也是一个数组,但没有被 final 修饰,可以改变长度:byte[] value = new byte[16];
StringBuffer类:
StringBuffer 与 StringBuilder 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 类中也是使用数组保存字符串,但是没有用 final 关键字修饰,所以这两种对象都是可变的。
2. 线程安全性
String 中的对象是不可变的,可以理解为常量,线程安全;
StringBuffer 与 StringBuilder 原理和基本操作相同,区别在于 StringBuffer 支持并发操作,对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的,适合多线程中使用;
StringBuilder 不支持并发操作,没有对方法加同步锁,所以是非线程安全的,适合单线程中使用。
3. 性能
A. 字符串进行相加,内存中会有多个字符串,占用空间多,效率低下;每次对 String 对象进行修改的时候,都会产生新的对象。
String s = "a" + "b" + "c" = "abc"; 【"a", "b", "c", "ab" , "abc" 共5个字符串】。
B. StringBuilder 在内存中始终是一个数组,占用空间少,效率高,初始容量为 16 ,如果超出了 StringBuilder 的容量,会自动扩容。
"a" + "b" + "c" = "abc"
C. StringBuffer 每次都会对 StringBuffer 对象本身进行操作,不产生新的对象,相较于 StringBuilder 效率低。