String、StringBuffer 和StringBuilder的区别是什么?String 为什么是不可变的?
String、StringBuffer 和StringBuilder的区别是什么?String 为什么是不可变的?
可变性
简单来说:String 类中使用final关键字修饰字节数组来保存字符串,private final byte[] value; ,所以String对象是不可变的。而StringBuilder 与StringBuffer 都继承自AbstractStringBuilder类,在AbstractStringBuilder中也是使用字节数组保存字符串 byte[] value,但是没有用final关键字修饰,所以这两种对象都是可变的。StringBuilder与StringBuffer的构造方法都是调用父类的构造方法也就是AbstractStringBuilder实现的。
线程的安全性
String中的对象是不可变的,可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuuilder与StringBuffer的公共父类。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以线程是安全的。如下图:
StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。