最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

当前速读:【JVM】JDK7后intern方法总结

来源:博客园

JDK6及之前字符串常量池是放在永久代的,这里不讨论,JDK7之后将字符串常量池迁移到了JVM的堆中,注意删除永久代更换为元空间是JDK8哈。

测试代码1如下:

@Test    public void test01() {        String str2 = new StringBuilder("12").append("34").toString();        String intern = str2.intern();        String str1 = "1234";        System.out.println(str2 == intern);        System.out.println(str1 == intern);            }

输出结果:


【资料图】

true

true

测试代码2如下:

@Test    public void test02() {        String str1 = "1234";        String str2 = new StringBuilder("12").append("34").toString();        String intern = str2.intern();        System.out.println(str2 == intern);        System.out.println(str1 == intern);    }

输出结果:

flase

true

结论:

String调用intern()方法时,会先去字符串常量池中查找,如果有,返回字符串常量池中的常量对象引用地址;如果没有,将当前字符串放入字符串常量池后,返回常量池中的常量对象引用地址,即当前String对象引用地址。

用法:

用于大量重复字符串的创建,速度会略慢于直接创建,因为会执行一次intern方法,但是会节省大量内存,因为创建时只需要保存一份常量池的引用即可,同时因为常量池被放到堆中,相当于间接降低了gc频率,所以最终并不一定会降低程序性能

关键词: 字符串常量 对象引用