这篇文章将对字符串的驻留做详细的解释和剖析。
鉴于个人水平和理解能力有限,请大神多多指导和提供不同的想法。
原文:这是一个很久以前就备受瞩目的问题,有很多原因导致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();
}
//<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面试中的一些问题的解答,也会对其有帮助。