String 的存储
方法区中的运行时常量池(Runtime Constant Pool)
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
,因为都指向同一块内存地址。
堆(heap)中
String a = "abc";
String b = new String("abc");
System.out.println(a == b);
此时打印的是 false
, new String("abc")
是在堆中开辟内存, a
指向的是运行时常量池中的 abc
,b
指向的是堆中的 abc
,地址不同。
intern()
String a = "abc";
String b = new String("abc");
System.out.println(a == b.intern());
打印 true
,与上面的相比,b
多调用了 intern()
方法,该方法会将堆中的数据挪至常量池中。