String是不可变的,因为它被声明为final类型,也就不可以被继承。
java 8 中,String使用char[] 存储数据
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
……
}
java 9 之后,String使用byte[] 存储数据
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final byte[] value;
/** The identifier of the encoding used to encode the bytes in {@code value}. */
private final byte coder;
}
value数组被声明为final,当value数组初始化后就不能再改变了,而且String类中没有改变value的方法,因此保证了String不可变。
那么,String不可变有什么好处呢?
1、 可以缓存hash值
因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。
2、 String Pool(缓存池)
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用String Pool。
3、 安全性
String 经常作为参数,String 不可变性可以保证参数不可变。例如在作为网络连接参数的情况下如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。
4、 线程安全
String 不可变性天生具备线程安全,可以在多个线程中安全地使用。
高频面试题:String, StringBuffer and StringBuilder的区别?
1、 String是不可变的,天生线程安全。
2、 StringBuffer是线程安全的,内部用了synchronized来同步。
3、 StringBuilder是线程不安全的。
4、 性能上StringBuilder > StringBuffer ,但是一般不用StringBuilder。