为什么 String 被设计为是不可变的?
- 成员属性value
private final byte[] value;
value 属性为字节数组并且被final修饰,定义后value的地址是不可变的。
value 属性为private修饰的所以是类的私有属性,外部不能直接访问。
-
构造器
除了构造器外没有对提供对value做赋值修改相关的功能。 -
String 类被final所修饰
不可以被继承 -
缓存hash值
private int hash;
因为String是不可变对象,所以可以缓存hash值减少哈希运算
- 设计为不可变的好处
(1)对字符串做修改不会修改原有内存中的值,而是会创建一个新的对象,保证了原对象的引用内容不变
(2)因为String是不可变的,所以hash值也不会变化,经过缓存hash值,可以更好更快的利用缓存得出hash值并且常用于map等集合的key值使用。
(3)java中字符串存储于字符串常量池中,节省内存的使用。
(4)因为是不可变所以天然的保证了线程安全,避免了很多不必要的同步操作。