final 关键字的作用:
1. 若 final 修饰类,则表明该类不可被继承
2. 若 final 修饰方法,则表明该方法不可被重写
3. 若 final 修饰变量,则该变量的值一经初始化后便不能被修改
public final class String implements Serializable, Comparable<String>, CharSequence {
private final byte[] value;
// ...
}
1. final 修饰 String 类,String 类不可被继承
2. String 类的值 value 保存在 byte 数组中,该数组被 private final 修饰
private 修饰,表明 value 无法被外部对象访问
final 修饰,表明 value 的引用地址不能被修改
保护性拷贝保证了 value 的内容不会被修改
so,String 类是不可变类
那么,String 类为何要设计为不可变类?
字符串常量池的需求
字符串被创建时,会优先判断该字符串是否已存在于字符串常量池中
若存在,则返回现有字符串的引用
若不存在,则创建一个新的对象
图 1
1. 创建 str2
2. 判断 hello 是否已存在于字符串池中
3. 存在,返回 str1 的引用
若 String 类不是不可变类,修改 str1 的内容为 world,str2 的内容也会被修改为 world
so,字符串池是来帮倒忙的吗?
缓存 hashcode
String 类是不可变类保证了 hashcode 的值不会被改变,使得该 hashcode 无需被重复计算
安全性
线程安全