private static void v1() { //true
String s1 = new String("a") + new String("a");
s1.intern();
String s2 = "aa";
System.out.println("v1: " + (s1 == s2));
}
private static void v2() { //false
String s3 = new String("b") + new String("b");
String s4 = "bb";
s3.intern();
System.out.println("v2: " + (s3 == s4));
}
private static void v3() {// false
String s5 = new String("cc");
s5.intern();
String s6 = "cc";
System.out.println("v3: " + (s5 == s6));
}
private static void v4() {// false
String s7 = new String("dd");
String s8 = "dd";
s7.intern();
System.out.println("v4: " + (s7 == s8));
}
private static void v5() {// true
String s9 = new StringBuilder("e").append("e").toString();
s9.intern();
String s10 = "ee";
System.out.println("v5: " + (s9 == s10));
}
private static void v6() {// false
String s11 = new StringBuilder("e").append("e").toString();
String s12 = "ee";
s11.intern();
System.out.println("v6: " + (s11 == s12));
}
v1.value是真的 v2.value是假的 v3.value是假的 v4.value是假的 v5.value是真的 v6.value是假的
发生什么事了?
为什么s1 == s2取决于实习生()的顺序?
是" s1.intern()"改变s1?
是v1 == v5和v2 == v6?
jdk1.6和1.7之间有什么区别吗?我用1.7。
也许我的问题没有准确描述?
事实上,我从“了解JVM:高级功能和最佳实践”中得到了答案。 Jdk1.6实习生,是将一个实例复制到常量池中,并返回其引用; 1.7是对象进入常量池的引用。所以当我使用s1 == s2来比较引用时,我得到了真的。
此问题与您标记的"重复"无关。因为我关心参考文献之间的比较。
答案 0 :(得分:-1)
始终将字符串与equals
进行比较,例如将s1 == s2
替换为s1.equals(s2)
。第一个仅比较s1
和s2
的引用,而后者则比较内容。
关于intern
方法,请阅读底部的this:
返回与此字符串具有相同内容的字符串,但保证来自唯一字符串池。
因此,对于实习字符串,您必须使用s1 = s1.intern();
。