- 不可变对象:一个对象被创建后,状态不能改变,则认为该对象被认为是不可变的
- String类是不可变类,一个String对象被创建以后,包含这个对象中的字符串序列是不可改变的。
String类为什么不可变
阅读String类的源代码可知:
- char[ ]字符数组被final修饰代表它不可指向新的数组,不能代表数组本身的数据不能被改变。它还被private修饰,且String没有暴露和提供任何修改字符数组的方法。
- String类型被final修饰了代表其不可被继承,从而杜绝了子类覆盖父类行为的可能。
注:自JDK1.9版本开始,String则以byte[ ]存储(目的是为了节省内存)
String类不可变的优点
- 保证字符串常量池复用的可靠
- 哈希码只需要计算一次,可以放心使用和哈希计算相关的对象
- 不可变对象是线程安全的
"可变"字符串StringBuilder;StringBuffer
- 相同点:都是可变字符串,均继承AbstractStringBuilder父类
- 区别:StringBuilder:线程不安全,性能好; StringBuffer:线程安全(每个方法都加synchronized锁),性能差