graph LR
s(字符串常量池)--位于-->h(堆)
c(class文件常量池)--位于-->m(元空间)
r(运行时常量池)--位于-->m
graph LR
s(字符串常量池)--位于-->h(堆)
c(class文件常量池)--位于-->m(永久代)
r(运行时常量池)--位于-->m
graph LR
s(字符串常量池)--位于-->p(永久代)
c(class文件常量池)--位于-->p
r(运行时常量池)--位于-->p
本质上是一个哈希表,jdk6 中是固定大小的,jdk7 可以通过参数指定。
jdk6 及以往版本,是方法区的一部分,用于存放字符串对象。
jdk7 将字符串池放到了堆中,可以存放字符串对象,也可以存放字符串引用。
new String("abc")
,如果字符串常量池中已经存在 “abc”,则创建一个对象,如果没有,则先在字符串常量池创建“abc”,再在堆中创建一个拷贝对象
因为其构造方法是
String(String str)
,括号内相当于双引号赋值方式创建字符串
字符串的 intern() 方法:
public static void main(String[] args)
{
String s = new String("1");
s.intern();
String s2 = "1";
System.out.println(s == s2);//堆中和常量池中,地址不同
String s3 = new String("1") + new String("1");
s3.intern();
String s4 = "11";
System.out.println(s3 == s4);//jdk7 常量池中的引用和堆中相同
}
/**
打印结果是
jdk6 下false false
jdk7 下false true
**/