Java 中的String 被设计为不可变对象主要有两方面的原因
1. 高效 2. 安全
String Pool
当一个字符串被创建,另一个相同的内容的字符串创建时,会引用String 缓冲池中已经存在的对象,而不是从新创建一个对象
下面的代码只会在堆中创建一个String对象
String string1 = "abcd";
String string2 = "abcd";
Hashcode
String经常被用作HashMap 或者HashSet的key,如果String是不可变的,有利于保证Hash值一直是不变的,我们也不需要一直修改hash值
有利于其他对象
有些对象比如HashSet,内部的值是唯一的,如果String可以修改,那么HashSet<String> 就可能违反他的内部元素唯一性
安全
String经常作为类中被使用,如果他是可变的,方法在使用某个String时,他被修改了,会有很严重的安全风险
保证了线程的安全
String的不可变性使他可以被多个线程共享