代码
@Slf4j public class StringCompareDemo { public static void compare() { String a = "1"; String b = "1"; log.info(" String a = "1"; " + "String b = "1"; " + "a == b ? {}", a == b); //true String c = new String("2"); String d = new String("2"); log.info(" String c = new String("2"); " + "String d = new String("2");" + "c == d ? {}", c == d); //false String e = new String("3").intern(); String f = new String("3").intern(); log.info(" String e = new String("3").intern(); " + "String f = new String("3").intern(); " + "e == f ? {}", e == f); //true String g = new String("4"); String h = new String("4"); log.info(" String g = new String("4"); " + "String h = new String("4"); " + "g equals h ? {}", g.equals(h)); //true } }
执行结果
String a = "1"; String b = "1"; a == b ? true ---- String c = new String("2"); String d = new String("2");c == d ? false ----- String e = new String("3").intern(); String f = new String("3").intern(); e == f ? true --- String g = new String("4"); String h = new String("4"); g equals h ? true
分析
第一个相等,是因为 Java 的字符串驻留机制,直接使用双引号声明出来的两个 String 对象指向常量池中的相同字符串。
第二个不相等,是因为new 出来的两个 String 是不同对象,引用当然不同,所以得到 false 的结果。
第三个相等,是因为使用 String 提供的 intern 方法也会走常量池机制,所以同样能得到 true。
第四个相等,是因为string重写了equals,equals内部是比较的是字符串的值。