class Test {
public static void main(String...args) {
String s1 = "Good";
s1 = s1 + "morning";
System.out.println(s1.intern());
String s2 = "Goodmorning";
if (s1 == s2) {
System.out.println("both are equal");
}
}
}
这段代码在Java6和Java7中产生不同的输出。在Java6中,s1==s2
条件返回false
,而在Java7中,s1==s2
返回true
。为什么?
为什么这个程序在Java6和Java7中产生不同的输出?
发布于 2011-08-29 07:59:56
让我们从示例中省略不必要的细节:
class Test {
public static void main(String... args) {
String s1 = "Good";
s1 = s1 + "morning";
System.out.println(s1 == s1.intern()); // Prints true for jdk7, false - for jdk6.
}
}
让我们把String#intern
看作是一个黑盒。根据运行的几个测试用例,我可以得出如下结论:
Java 6:
如果池中包含的对象等于this
,则返回对该对象的引用,否则创建新的字符串(等于this
),放入池中,然后返回对创建的实例的引用。
Java 7:
如果池中包含的对象等于this
,则返回对该对象的引用,否则将this
放入池中,并返回this
。
Java6和Java7都不会破坏contract of the method。
似乎新的实习生方法行为是修复这个bug的结果:http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6962931。
发布于 2011-08-17 11:35:48
在jdk6中:String s1="Good";
在常量池中创建一个字符串对象"Good“。
s1=s1+"morning";
在常量池中创建了另一个字符串对象"morning“,但这次实际上是这样做的:s1=new StringBuffer().append(s1).append("morning").toString();
。
现在,由于new
操作符在堆中创建了一个对象,因此s1
中的引用是堆而不是常量池的,并且String s2="Goodmorning";
在常量池中创建了一个字符串对象"Goodmorning“,其引用存储在s2
中。
因此,if(s1==s2)
条件为false。
但是在jdk7中会发生什么呢?
发布于 2011-08-15 21:15:04
您需要使用s1.equals(s2)
。对String
对象使用==
会比较对象引用本身。
编辑:当我运行你的第二个代码片段时,我没有打印出“两者都相等”。
Edit2:澄清了使用'==‘时会比较引用。
https://stackoverflow.com/questions/7065337
复制相似问题