为什么字符串在Java中是不可变的?

来源:互联网 发布:好用的windows平板 编辑:程序博客网 时间:2024/06/04 18:52

 这是一个古老但仍然流行的问题。Java中字符串被设计成不可变的,有多种原因。很好的答案取决于你对内存,同步,数据结构等更好的理解,下面,我总结一些答案。

1.String Pool中的要求

字符串池在方法区(Method Area)中是一种特殊的存储区域。当创建一个字符串时,如果字符串已经存在于池中,现有字符串的引用将被退回,而不是创建一个新的对象并返回其引用。

下面的代码将在堆中只会创建一个字符串对象。

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

在堆中就是这样的:


如果字符串不是一成不变的,在只有一个引用下不断变化的字符串将导致对其他引用取得错误的值。

2.允许字符串来缓存其哈希码

在Java中字符串的哈希码常被用到。例如,在HashMap中不可变保证了哈希码将永远是相同的,因此,完全不用担心字符串的变化实现这个不可变的特性,这意味着,每次被用时没必要去计算其哈希码,所以,这更有效。

在String类,类中有如下代码:

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

3.安全性
字符串为许多Java类被广泛用作参数,如网络连接,打开文件等,如果字符串是可变的,则连接,打开文件将会被改变并会导致严重的安全威胁。该方法还以为是连接到一台机器上,但事实并非如此。可变字符串在反射机制中同样能引起安全性问题,因为这些参数都是字符串。

下面是一段代码示例:

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面试中许多其他“为什么”问题。


原文:

Why string is immutable in Java ?


0 0
原创粉丝点击