为什么s1 == s2取决于实习生的顺序()

时间:2016-11-07 12:22:01

标签: java string stringbuilder

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来比较引用时,我得到了真的。 此问题与您标记的"重复"无关。因为我关心参考文献之间的比较。

1 个答案:

答案 0 :(得分:-1)

始终将字符串与equals进行比较,例如将s1 == s2替换为s1.equals(s2)。第一个仅比较s1s2引用,而后者则比较内容

关于intern方法,请阅读底部的this

  

返回与此字符串具有相同内容的字符串,但保证来自唯一字符串池。

因此,对于实习字符串,您必须使用s1 = s1.intern();