String为什么是不可变的
为什么说String是不可变的
- 看String类源码,String本质是char数组,且成员用了private和final修饰;
- 虽说final修饰只是相应的地址不可变,String类源码也没有更改char数组元素的相关代码;
- Java设计师还把整个String设成final禁止继承,避免被其他人继承后破坏;
- 给一个已有字符串如"abc"第二次赋值成"abcd",不是在原内存地址上修改数据,而是重新指向一个新对象,新地址。
不可变的好处
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 不可变性天生具备线程安全,可以在多个线程中安全地使用。