JAVA 中为何String 是immutable的

本文翻译自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/java

这是一个很老但很流行的问题,这里有几个缘由String在java中被设计成immutable的。对内存、同步、数据结构等有好的理解,能更好的回答这个问题。下面我将简单的介绍这些缘由:面试

1, String Pool的须要。缓存

String pool(String intern pool) 是一个方法区里的特殊的存储区域。当建立一个String, 若是它已经在pool中存在,则会返回一存在String的引用,相反,怎会建立一个新的String,并返回该引用。安全

下面的代码将仅仅在堆中建立一个String对象。网络

String string1 = "abcd";
String string2 = "abcd";

如图:数据结构

若是String不是immutable的,改变String的一个引用将致使另外一个引用的到错误的值this

2. 容许String缓存它的hashcodespa

String的hashcode在JAVA中是使用很是频繁的。例如在HashMapzhong, String设计成immutable保证了hashcode老是同样的,因此hashcode能够被缓存而不用担忧改变。也就是说,不须要每次在使用hashcode时都去计算一遍,这样更高效。翻译

在String类里,代码:设计

private int hash;//this is used to cache hash code.

3. 安全

String普遍的做为参数被JAVA中的类使用,好比 网络链接,打开的文件等等,若是String不是immutable,一个链接或文件的改变将致使严重的安全威胁,一个方法还觉得正链接到一个机器上,并其实没有。可变的String一样将致使反射的安全性问题,由于反射中的参数都是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);
}

总之:缘由包括设计、效率和安全。实际上,这三点也是JAVA面试中一些“为何”的答案。

相关文章
相关标签/搜索