代碼 @Slf4j public class StringCompareDemo { public static void compare() { String a = "1"; String b = "1"; log.info("\nString a = \"1\";\n" + "String b ...
代碼
@Slf4j public class StringCompareDemo { public static void compare() { String a = "1"; String b = "1"; log.info("\nString a = \"1\";\n" + "String b = \"1\";\n" + "a == b ? {}", a == b); //true String c = new String("2"); String d = new String("2"); log.info("\nString c = new String(\"2\");\n" + "String d = new String(\"2\");" + "c == d ? {}", c == d); //false String e = new String("3").intern(); String f = new String("3").intern(); log.info("\nString e = new String(\"3\").intern();\n" + "String f = new String(\"3\").intern();\n" + "e == f ? {}", e == f); //true String g = new String("4"); String h = new String("4"); log.info("\nString g = new String(\"4\");\n" + "String h = new String(\"4\");\n" + "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內部是比較的是字元串的值。