这篇文章将对字符串的驻留做详细的解释和剖析。  

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

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

1.字符串池的需要

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

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

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

看看他是怎么工作的:

JAVA String 显示不全 java中为什么会出现string无法_java

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

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(); 
}
    //<span style="orphans: 2; text-align: -webkit-auto; widows: 2; font-family: Arial, Helvetica, sans-serif;"><span style="font-size:12px;">下面将导致危险,如果在使用其他引用后字符串已经被改变</span></span>
    
    causeProblem(s);
}


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