String,简单又复杂

String,简单又复杂


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"应该是放在堆中.
还是想的不明白.

你可能感兴趣的:(String,简单又复杂)