现在的位置: 首页 > 综合 > 正文

为什么字符串在Java中是常量存在(不可变的)

2013年10月01日 ⁄ 综合 ⁄ 共 971字 ⁄ 字号 评论关闭

这篇文章将对字符串的驻留做详细的解释和剖析。  引自:http://www.programcreek.com/2013/04/why-string-is-immutable-in-java/

鉴于个人水平和理解能力有限,请大神多多指导和提供不同的想法。

原文:这是一个很久以前就备受瞩目的问题,有很多原因导致String在Java中是不可变的量,首先要解决这个问题,取决于你对内存布局,同步问题,数据结构等有一个好的理解和清晰的认识,下面我们将以例子来总结这些。

1.字符串池的需要

字符串池(字符串驻留池)在Java堆中是一片特殊的存储区域,当一个字符串A被创建而这个字符串早已存在字符串池中时,那个已经存在的字符串B的引用将传递给A,而不是创建一个新的对象返回该对象的引用。

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

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

看看他是怎么工作的:

如果字符串是固定的,改变一个字符串的引用将导致其他错误引用的值。

2.允许字符串记住哈希码的缓存

字符串的哈希码在Java中已经被广泛使用了,例如在HashMap中,不变的字符串保证了它的hashcode将总是那个,所以将不必担心赋值带来的改变,也就是说,当字符串使用时不必每一次计算hashcode的改变,效率会更高。

在String类(java.lang.String)中,有下面一段代码(参考JDK下面的SRC文件):

private int hash;//这个值将用来缓存哈希码的

3.安全

字符串在很多Java类中当做参数被广泛的使用,例如网络连接,开源文件等等,假如字符串是可变的。连接或文件将可能被修改进而遭受严重的安全威胁,下面这个方法是想让我们知道它的作用是连接到一台机器上,如果没有连接上,可变的字符串将在反射上面制造安全危机,字符串作为参数也有这样的危险。

下面代码举例:

boolean connect(string s){
    if (!isSecure(s)) { 
throw new SecurityException(); 
}
    //下面将导致危险,如果在使用其他引用后字符串已经被改变
    
    causeProblem(s);
}

总之,字符串不可改变的原因有包括了设计,效率,安全。事实上,这也适用于在Java面试中的一些问题的解答,也会对其有帮助。


抱歉!评论已关闭.