String s = s1 + s2;(s1& s2是String literals)从哪里返回?堆或池

时间:2015-03-21 20:37:49

标签: java string

    String s1="abc";                 //pool
    String s2="abccde";              //pool
    String s3="cde";                 //pool
    String s4=s1+s3;                 //heap
    String s5=new String("abccde");  //heap

    System.out.println(s2==s4);
    System.out.println(s4==s5);
    System.out.println(s2==s5);

我期待虚假,真假,但结果都是假的。虽然我尝试使用.intern();在s4中,我知道s2 == s4意思是在intern()之后;它从池中返回所以它早于从堆返回,那么为什么s4 == s5给出的是真的?

由于

2 个答案:

答案 0 :(得分:0)

因为new总是会创建一个新对象,而且没有机会从池中返回一个对象?它是一个构造函数,而不是像intern()这样的工厂方法。

答案 1 :(得分:0)

当您明确使用s5关键字时,其中任何一个都不会与new相同。

如果编译器可以确定s1s3是文字常量,它会将concat视为文字constant。但是,编译器无法做出决定。