String a = "abc";
String b = "abc";
Assert.assertTrue(a == b);
String c = "abcdefg";
String d = c.substring(0, 3);
Assert.assertFalse(a == d);
a == b這個比較好理解,因為在編譯的時候會產生一個靜態對象“abc”, 執行a = "abc"和b = "abc"的時候,只是把這個靜態對象賦給了a和b,所以兩個對象的引用相同,a==b
但是,d的值為"abc"字符串,為什么jvm不把靜態的"abc"的引用賦給d對象呢?
我的理解是:String a = "abc"; String b = "abc";這兩行代碼是在解釋執行之前編譯成字節碼的時候,"abc"就放在常量池中了,所以在執行的時候a和b指向同一個引用,而String d = c.substring(0, 3);是在執行的時候才給d對象賦值"abc",所以這個"abc"應該是放在堆中.
還是想的不明白.