1 String a = "abc"; 2 String b = "abc"; 3 System.out.println(a == b);
此時打印的是 true
,abc
存放於方法區中的運行時常量池,1執行時,去常量池中查找,是否存在 abc
,若是不存在就建立常量 abc
。2執行,也去常量池查找是否存在 abc
,存在就直接將 b
的地址指向 abc
,最後 a==b
返回的就是 true
,由於都指向同一塊內存地址。java
String a = "abc"; String b = new String("abc"); System.out.println(a == b);
此時打印的是 false
, new String("abc")
是在堆中開闢內存, a
指向的是運行時常量池中的 abc
,b
指向的是堆中的 abc
,地址不一樣。code
String a = "abc"; String b = new String("abc"); System.out.println(a == b.intern());
打印 true
,與上面的相比,b
多調用了 intern()
方法,該方法會將堆中的數據挪至常量池中。內存