String 的存儲

方法區中的運行時常量池(Runtime Constant Pool)

1 String a = "abc";
2 String b = "abc";
3 System.out.println(a == b);

此時打印的是 trueabc 存放於方法區中的運行時常量池,1執行時,去常量池中查找,是否存在 abc,若是不存在就建立常量 abc。2執行,也去常量池查找是否存在 abc,存在就直接將 b 的地址指向 abc,最後 a==b 返回的就是 true,由於都指向同一塊內存地址。java

堆(heap)中

String a = "abc";
String b = new String("abc");
System.out.println(a == b);

此時打印的是 falsenew String("abc")是在堆中開闢內存, a 指向的是運行時常量池中的 abcb 指向的是堆中的 abc,地址不一樣。code

intern()

String a = "abc";
String b = new String("abc");
System.out.println(a == b.intern());

打印 true,與上面的相比,b 多調用了 intern() 方法,該方法會將堆中的數據挪至常量池中。內存

相關文章
相關標籤/搜索