s不是對象, 是對象的地址
只有String有個 pool 生成字符串對象時,先在池里找有沒有 abc, 生成的 new String() 是在堆里面的
String s = new String("abc");
String s1 = "abc";
String s2 = new String("abc");
//對引用類型來說==號比較的是內(nèi)存的地址 (原生數(shù)據(jù)比較的是值)
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
System.out.println(s.equals(s1));
System.out.println(s.equals(s2));
System.out.println(s1.equals(s2));
System.out.println("--------------------------------");
System.out.println(s == s.intern());
System.out.println(s1 == s1.intern());
System.out.println(s.intern() == s2.intern());
System.out.println("--------------------------------");
String hello = "hello";
String he = "he";
String llo = "llo";
//如果==號2邊都是常量值的話,拼完會在常量池檢查有沒有對應(yīng)的值
System.out.println(hello == "he" + "llo"); //true
//如果有不是常量(變量), 不檢查常量池了, 直接在堆中創(chuàng)建對象
System.out.println(hello == "he" + llo); //false
執(zhí)行結(jié)果:
false
false
false
true
true
true
--------------------------------
false
true
true
--------------------------------
true
false