public class Demo {

    public static void main(String[] args) {

        String s1 = "Hello";
        String s2 = "Hello";
        System.out.println("s1 == s2 " + (s1 == s2));

        String s5 = "Hel" + "lo";
        String s6 = "He" + "llo";
        System.out.println("s5 == s6 " + (s5 == s6));

        String s7 = "He";
        String s8 = "Hello";
        s7 = s7.concat("llo");
        System.out.println("s7 == s8 " + (s7 == s8));

        String s10 = "He";
        s10 = s10 + "llo";
        System.out.println("s1 == s10 "+(s1 == s10));
    }
}

在前面的代码中,s7 == s8和s1 == s10给出false。有人可以解释一下,s7 = s7.concat(“llo”)中实际上发生了什么;并且s10 = s10 +“llo”;我了解==运算符会检查引用,而equal()会检查对象的内容。但是我需要知道为什么s7和s10引用变量的位模式与s8和s1不同。如果这些与编译时生成的字符串和运行时生成的字符串有关,那么我如何确定它是编译时字符串还是运行时字符串?

最佳答案

发生这种情况的原因是因为Java正在编译器中进行优化。当看到您正在将文字字符串"Hello"分配给s1时,它对s2使用相同的“Hello”,因为所有Java String操作都是非破坏性的(例如,它们返回一个克隆而不是修改原始的),所以这是一个安全的事情。
"Hel" + "lo""He" + "llo"也是一样;足够聪明地弄清楚它们是同一回事。

其他对象则非常复杂,无法对其进行优化,因此您最终得到了单独的对象。

09-16 15:19