下面程序的输出结果,参考代码中的注释,原因也在其中。
public class MyDemo { public static void main(String[] args) { String s1 = "Programming"; String s2 = new String("Programming"); String s3 = "Program"; String s4 = "ming"; String s5 = "Program" + "ming"; String s6 = s3 + s4; System.out.println(s1 == s2); // false 因为一个在常量池中,一个在堆内存中 System.out.println(s1 == s5); // true 因为都在常量池中 System.out.println(s1 == s6); // false 字符串的+操作其本质是创建了StringBuilder对象进行append操作,即s6在堆内存中 System.out.println(s1 == s6.intern()); // true 因为intern方法会得到字符串对象在常量池中对应的版本的引用 System.out.println(s2 == s2.intern()); // false 因为s2本身在堆内存中 } }
关于StringBuilder、StringBuffer与String的差别就不多讲了。