贵阳市住房建设局网站,深圳精品网站建设,wap网站还用吗,便宜高端网站设计Java6 和6之前#xff0c;常量池是存放在方法区#xff08;永久代#xff09;中的。Java7#xff0c;将常量池是存放到了堆中。Java8 之后#xff0c;取消了整个永久代区域#xff0c;取而代之的是元空间。运行时常量池和静态常量池存放在元空间中#xff0c;而字符串常…
Java6 和6之前常量池是存放在方法区永久代中的。Java7将常量池是存放到了堆中。Java8 之后取消了整个永久代区域取而代之的是元空间。运行时常量池和静态常量池存放在元空间中而字符串常量池依然存放在堆中。
jdk1.6 以及之前下字符串常量池是在方法区中是与堆完全独立的两个空间。intern()方法能使一个位于堆中的字符串在运行期间动态地加入到字符串常量池中字符串常量池的内容是程序启动的时候就已经加载好了如果字符串常量池中有该对象对应的字面量则返回该字面量在字符串常量池中的引用否则创建复制一份该字面量到字符串常量池并返回它的引用。
jdk1.7,1.8 下字符串常量池已经转移到堆中了是堆中的一部分内容jvm 设计人员对 intern() 进行了一些修改当执行 intern() 时jvm 不再把字符串对应的字面量复制一份到字符串常量池中而是在字符串常量池中存储一份字符串的引用这个引用指向堆中的字面量当运行到 String s hellohello时发现字符串常量池已经存在一个指向堆中该字面量的引用则返回这个引用。
实例1
常量与常量的拼接结果在常量池中常量与常量拼接时只要其中有一个是变量 结果就在堆中
public class Test{public static void main(String[] args){String str helloworld;String str1 hello;String str2 world;String str3 hello world;String str4 hello str2;String str5 str1 world;System.out.println(str1 str2); //falseSystem.out.println(str str3); //trueSystem.out.println(str str4); //falseSystem.out.println(str str5); //falseSystem.out.println(str4 str5); //false}
}实例2
String s new String(abc); //创建了几个对象
// 2个
// 第一个对象是abc字符串存储在常量池中
// 第二个对象是创建在Heap堆中的String对象
// 这里的s是放在栈里面的指向了Heap堆中的String对象。实例3
new 出来的 String 对象可以通过 intern() 方法将堆中的字符串对象放到常量池这个方法的意思就是先到常量池中查询当前对象是否存在存在就返回常量池中地址不存在就加入常量池也返回加入时常量池地址。
// 双引号直接放入常量池
String s1 1;
String s2 new String(1);
System.out.println(s1 s2); // false//先到常量池中查询是否有1,存在就将常量池中对象返回,不存在就放到常量池中
String s3 new String(1).intern();
System.out.println(s1 s3) // trueString t3 new String(2) new String(2);
String t4 22;
System.out.println(t3 t4); // false
t3 t3.intern();
System.out.println(t3 t4); // true参考https://blog.csdn.net/Tao_Yuanqiang/article/details/108040262