您的位置:首页 > 编程语言 > Java开发

在Java中为什么String不可变

2013-11-21 15:22 477 查看
原文:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

这是一个很老但是仍然流行的问题.有很多原因导致String在Java中被设计为不可变.一个好的答案要依据对内存,同步,数据结构等充分的理解.下面,我将概括这些答案.

1. String池的要求
String池(String保留池)在Java堆上是一个很特殊的存储区域.当一个字符串被创建并且字符串已经在池中存在,那这个存在的字符串的引用将被返回,而不是创建一个新的对象并返回这个对象的引用.
下面这段代码将只创建一个字符串对象

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

看起来应该是这样:



如果String不是不可变的,那么改变一个引用的字符串的值将导致错误值对于其他引用.

2. 允许String去缓存它的hashcode
在Java中字符串的hashcode频繁的被使用.例如,HashMap.变为不可变保证hashcode将总是相同,所以它可以被兑现而不用担心改变.这就意味着,使用的时候不需要每次都计算hashcode.这会有更高的效率.
在String类里,有以下代码:

private int hash;//被用来缓存hashcode.


3. 安全

String广泛的被用来做为许多Java类的参数,例如网络连接,打开文件等.String不是不可变,一个连接或者文件将被改变那会带来严重的安全威胁.这个方法认为它是连接到一台机器,但并非如此.可变的字符串对于反射也会导致安全问题,因为参数是字符串.

下面是代码示例:

boolean connect(string s){
if (!isSecure(s)) {
throw new SecurityException();
}
//这里将会导致问题,如果在这之前通过其他引用被改变.

[code=plain]causeProblem(s);

}[/code]
综上所述,原因包括设计,效率和安全.实际上,这也适合于Java面试中许多其他的"为什么"的问题.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: