关于java中==运算符的问题

ddf*_*fal 4 java string equals operator-keyword

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

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

iss*_*eng 11

之所以发生这种情况,是因为Java在编译器中进行了优化.当它看到你将文字字符串分配"Hello"给s1时,它对s2使用相同的"Hello",因为所有Java String操作都是非破坏性的(例如它们返回克隆而不是修改原始字符串),因此这是一个安全的要做的事.

同样的问题也发生在"Hel" + "lo"VS "He" + "llo"; 它足够聪明地弄清楚它们是同一个东西.

其他的很复杂,无法对它们进行优化,因此您最终会得到单独的对象.

  • "Hel"+"lo"和"He"+"llo"的优化是[常数折叠]的结果(http://en.wikipedia.org/wiki/Constant_folding). (5认同)