java String intern 原理理解
从JDK 1.7后,HotSpot 将常量池从永久代移到了元空间,正因为如此,JDK 1.7 后的intern方法在实现上发生了比较大的改变。
JDK 1.7后
,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别
。
区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引用
。
/**
* @author hsj
* @description: String 比较 equals,不使用 == ,这里只是讲解原理【JDK8】
* @date 2024-11-14 14:09
*/
public class StringTestDemo {
public static void main(String[] args) {
// String str1 = "string";
// String str2 = new String("string");
// String str3 = str2.intern();
//
// System.out.println(str1==str2);//#1 false
// System.out.println(str1==str3);//#2 true
//String baseStr = "baseStr";
//final String baseFinalStr = "baseStr";
//
//String str1 = "baseStr01";
//String str2 = "baseStr"+"01";
//String str3 = baseStr + "01";
//String str4 = baseFinalStr+"01";
//String str5 = new String("baseStr01").intern();
//
//System.out.println(str1 == str2);//#3 true
//System.out.println(str1 == str3);//#4 false
//System.out.println(str1 == str4);//#5 true
//System.out.println(str1 == str5);//#6 true
//比较奇怪的问题在于JDK 1.7后,对于第一种情况返回true,但是调换了一下位置返回的结果就变成了false。
//这个原因主要是从JDK 1.7后,HotSpot 将常量池从永久代移到了元空间,正因为如此,JDK 1.7 后的intern方法在实现上发生了比较大的改变。
//JDK 1.7后,intern方法还是会先去查询常量池中是否有已经存在,如果存在,则返回常量池中的引用,这一点与之前没有区别。
//区别在于,如果在常量池找不到对应的字符串,则不会再将字符串拷贝到常量池,而只是在常量池中生成一个对原字符串的引用。所以:
//结果 #7:在第一种情况下,因为常量池中没有“str01”这个字符串,所以会在常量池中生成一个对堆中的“str01”的引用,而在进行字面量赋值的时候,常量池中已经存在,所以直接返回该引用即可。
//因此str1和str2都指向堆中的字符串,返回true。
//结果 #8:调换位置以后,因为在进行字面量赋值(String str1 = “str01″)的时候,常量池中不存在,所以str1指向的常量池中的位置。
//而str2指向的是堆中的对象,再进行intern方法时,对str1和str2已经没有影响了,所以返回false。
//
//String str2 = new String("str")+new String("01");
//str2.intern();
//String str1 = "str01";
//System.out.println(str2==str1);//#7 true
String str1 = "str01";
String str2 = new String("str")+new String("01");
str2.intern();
System.out.println(str2 == str1);//#8 false
}
}
原文地址:https://blog.csdn.net/HSJ0170/article/details/143770583
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!