1、intern()的简介
1.1、jdk1.7之后的intern()方法的作用:
1、若是字符串常量池中不存在这个字符串,那么,就创建一个引用,把该字符串实例对象的引用复制过来,并返回该地址。
2、若是字符串常量池中已存在该字符串,那么直接返回该字符串的地址。
1.2、使用场景
String.intern()方法主要适用于程序中需要保存有限个会被反复使用的值的场景,这样可以减少内存消耗,同时在进行比较操作时减少时耗,提高程序性能。
1.3、各大框架String的操作都有使用intern()方法
2、例子
如一美团点评团队的《深入解析String#intern》文中举的一个例子:
static final int MAX = 1000 * 10000;
static final String[] arr = new String[MAX];
public static void main(String[] args) throws Exception {
Integer[] DB_DATA = new Integer[10];
Random random = new Random(10 * 10000);
for (int i = 0; i < DB_DATA.length; i++) {
DB_DATA[i] = random.nextInt();
}
for (int i = 0; i < MAX; i++) {
arr[i] = new String(String.valueOf(DB_DATA[i % DB_DATA.length])).intern();
}
}
在以上代码中,我们明确的知道,会有很多重复的相同的字符串产生,但是这些字符串的值都是只有在运行期才能确定的。所以,只能我们通过intern显示的将其加入常量池,这样可以减少很多字符串的重复创建
总结
按照上面的回答,就是说new String也会检查常量池,如果有的话就直接引用,如果不存在就要在常量池创建一个,那么还要intern干啥?难道以下代码是没有意义的吗?
String s = new String("hollo world").intern();
new String 所谓的“如果有的话就直接引用”,指的是Java堆中创建的String对象中包含的字符串字面量直接引用字符串池中的字面量对象。也就是说,还是要在堆里面创建对象的。
而intern中说的“如果有的话就直接返回其引用”,指的是会把字面量对象的引用直接返回给定义的对象。这个过程是不会在 Java 堆中再创建一个 String 对象的。
用直接返回给定义的对象。这个过程是不会在 Java 堆中再创建一个 String 对象的。
所以上面的代码是无意义的。