String类使用final关键字修饰,使用字符数组(private final char value[]
)来保存字符串,所以String对象是不可变的;
补充:在Java9之后,String类的实现改用byte数组(private final byte[] value
)存储字符串;
注意:如果多次使用类似ss+="b"
这样的操作,最好使用StringBuffer或者StringBuilder;
StringBuffer和StringBuilder都继承自AbstractStringBuilder类,在AbstractStringBuilder类中也是使用字符数组(char[] value
)来保存字符串,但没有使用final关键字修饰,所以它们的对象是可变的;
补充:StringBuffer和StringBuilder的构造方法都是调用父类AbstractStringBuilder类的构造方法;
String类的对象是不可变的,也可以理解为常量,线程安全;
StringBuffer对方法加了同步锁或者对调用的方法加了同步锁,所以线程安全;
StringBuilder并没有对方法加同步锁,所以线程不安全;
String类每次进行改变的时候,都会产生一个新对象,然后指向新的对象,而StringBuffer和StringBuilder是对对象本身进行操作,而且使用StringBuilder相比使用StringBuffer仅仅提高10%~15%的效率,但缺要冒多线程不安全的风险;
操作少量数据,适用String;
单线程操作字符串缓冲区下操作大量数据,适用StringBuilder;
多线程操作字符串缓冲区下操作大量数据,适用StringBuffer;