Translate from Simple java
为什么String被设计成了不可变型?
1. 字符串池的需要
String string1 = "abcd";
String string2 = "abcd";
如果字符串是可变的,那通过一个引用改变字符串的值将会导致另外一个引用有了错误的值
2. hashcode的缓存化
String的hashcode经常被使用,例如,HashMap的key值。String的不可变性保证了hashcode一直是相同的,这样可以方便把String的hashcode放在缓存中而不用担心它的改变。这意味着,不用每次使用它时都计算它的hashcode,这是一个非常效率的做法
3. 方便其他对象使用
为了更具体的表现,思考一下下面的问题:
HashSet<String> set = new HashSet<String>();
set.add(new String("a"));
set.add(new String("b"));
set.add(new String("c"));
for(String a: set)
a.value = "a";
在这个例子中,如果String是可变的,它的值可以改变,那set的设计(不包含重复的元素)将被违反。
4. 安全
String作为形参被广泛的运用在许多java类中,像网络连接,打开文件。如果String可变,一个连接或者文件可以被改变将导致严重的线程安全问题。下面是代码实例:
boolean connect(string s){
if (!isSecure(s)) {
throw new SecurityException();
}
//here will cause problem, if s is changed before this by using other references.
causeProblem(s);
}
5. 不可变的对象天然线程安全
因为不可变的对象不能够被改变,它们能被多个线程自由的共享。这减少了synchronization的使用。
总之,String被设计成不可变是为了效率和安全的目的。这也是为什么不可变对象在通常使用中被偏爱的原因