String概述
String被声明为final,因此它不可被继承。(Integet等包装类也不能被继承)
在Java8中,String内部使用char数组存储数据。
public final class String
implements java.io.Serializable,Comparable<String>, CharSquence{
/** The value is used for character storage. */
private final char value[];
}
在Java9之后,String内部使用byte数组存储字符串,同时使用code来标识使用了哪种编码。
value 数组被声明为 final,这意味着 value 数组初始化之后就不能再引用其它数组。并且 String 内部没有改变 value 数组的方法,因此可以保证 String 不可变。
不可变的好处
- 可以缓存hash值
因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 的 key。不可变的特性可以使得 hash 值也不可变,因此只需要进行一次计算。 - String Pool
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
3. 安全性
String经常作为参数,String不可变形可以保证参数不可变。
4.线程安全
String不可变性天生具备线程安全,可以在多个线程中安全使用
String StringBuilder StringBuffer
- 可变性
- String不可变的
- StringBuilder和StringBuffer可变
- 线程安全
- String不可变,因此是线程安全的
- StringBuilder不是线程安全的
- StringBuffer是线程安全的,内部使用synchronized进行同步
StringPool
字符串常量池。