场景
String.intern()
String.intern() 方法用于在字符串常量池中查找是否存在与指定字符串相等的字符串。
如果找到了,就返回该字符串的引用;否则,就在字符串常量池中创建一个新的字符串对象,并返回对它的引用。
这个方法对于避免创建重复的字符串对象非常有用,特别是在处理大量字符串数据时,可以显著减少内存使用。
需要明确Java(这里是JDK1.8)创建字符串的不同:
1.使用双引号声明的字符串对象会保存在字符串常量池中
2.使用new关键字创建的字符串对象会先从字符串常量池中找,如果没找到就创建一个,
然后再在堆中创建字符串对象;如果找到了,就直接在堆中创建字符串对象
看下面的两段代码,猜测下运行结果
String str1 = new String("公众号:霸道的程序猿");
String str2 = str1.intern();
System.out.println(str1 == str2);
这段运行结果为false
第一行,字符串常量池中会先创建一个公众号:霸道的程序猿的对象,
然后堆中会再创建一个公众号:霸道的程序猿的对象,str1引用的是堆中的对象。
第二行,str1执行intern()方法,该方法会从字符串常量池中查找公众号:霸道的程序猿,
常量池中存在公众号:霸道的程序猿字符串是因为第一行代码已经在字符串常量池创建公众号:霸道的程序猿字符串,
所以str2引用的是字符串常量池中的对象。str1 和 str2 的引用地址是不同的,str1一个来自堆ÿ