频道栏目
首页 > 程序开发 > 软件开发 > Java > 正文
Java基础——为什么Java中的String设计成不可变的?
2013-12-09 11:33:31         来源:sun_star1chen的专栏  
收藏   我要投稿

 

 

为什么Java中的String设计成不可变的? 这是一个老生常谈的问题了。在java中将String设计成不可变的原因有很多,然而一个好的答案取决于很好的理解java中的存储、同步、数据结构等等。一下是一些我总结的答案:

1、字符串池的需求

字符串池是方法区(Method Area)中的一块特殊的存储区域。当一个字符串已经被创建并且该字符串在 池 中,该字符串的引用会立即返回给变量,而不是重新创建一个字符串再将引用返回给变量。例如,以下代码只在堆中创建一个字符串对象:

 

String string1 = abcd;
String string2 = abcd;
他们看上去如下图:

 

\

如果字符串不是不可变的,那么改变一个引用(如: string2)的字符串将会导致另一个引用(如: string1)出现脏数据。

 

2、允许字符串缓存哈希码

在java中常常会用到字符串的哈希码,例如: HashMap 。String的不变性保证哈希码始终一,因此,他可以不用担心变化的出现。 这种方法意味着不必每次使用时都重新计算一次哈希码——这样,效率会高很多。

在String类中,有如下代码:

 

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

3、安全

 

String广泛的用于java 类中的参数,如:网络连接(Network connetion),打开文件(opening files )等等。如果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 String 设计成不可变的,考虑了设计、效率、安全等因素。事实上这也适用于其他Java面试中许多“为什么”的问题。

点击复制链接 与好友分享!回本站首页
相关TAG标签 基础
上一篇:手动配置S2SH三大框架报错(一)
下一篇:javascript中的变量作用域
相关文章
图文推荐
文章
推荐
点击排行

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站