String a="test";
String b="test";
if(a==b)
System.out.println("a == b");
else
System.out.println("Not True");
每个Java专家都知道这里的if(a==b)
会通过,因为有字符串池的存在。
根据字符串池的机制:
每次代码创建字符串文字时,JVM首先检查字符串文字池。如果池中已经存在该字符串,则返回对该实例的引用。如果在池中不存在该字符串,则创建一个新的String对象并将其放置在池中。JVM在此池中最多保留任何String对象的一个副本。字符串文字始终引用字符串池中的对象。
这就是为什么上面的代码中条件语句能够通过的原因。
现在问题来了。在上述代码中当我添加两行额外的代码 a+="1"
和 b+="1"
时,现在字符串a和b的值将是Test1
。
新的代码如下:
String a="test";
String b="test";
if(a==b)
System.out.println("a == b");
else
System.out.println("Not True");
a+="1"; //it would be test1 now
b+="1"; //it would also be test1 now
if(a==b)
System.out.println("a == b");
else
System.out.println("Not True");
现在,在修改了字符串后,当我放置了
if(a==b)
检查时,它没有通过。我知道这是由于String的不可变特性造成的,但我想知道:1) 修改后,JVM是否将它们存储为两个不同的对象?
2) JVM是否对任何字符串的修改调用
new String()
?3) 为什么尽管我在修改时尝试调用
intern()
,它们仍然不引用为单个对象?提示:
a+="1".intern();
b+="1".intern();