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给出的是真的?
由于
答案 0 :(得分:0)
因为new总是会创建一个新对象,而且没有机会从池中返回一个对象?它是一个构造函数,而不是像intern()这样的工厂方法。
答案 1 :(得分:0)
当您明确使用s5
关键字时,其中任何一个都不会与new
相同。
如果编译器可以确定s1
和s3
是文字常量,它会将concat视为文字constant。但是,编译器无法做出决定。