当前位置: 首页 > news >正文

深入理解JVM之.intern()的用法

intern只在常量池里记录首次出现的实例引用

来看一段代码

public class RuntimeConstantPoolOOM {public static void main(String[] args) {String str1 = new StringBuilder("计算机").append("软件").toString();System.out.println(str1.intern() == str1);String str2 = new StringBuilder("ja").append("va").toString();System.out.println(str2.intern() == str2);}
}

这段代码在JDK 6中运行,会得到两个false,而在JDK 7中运行,会得到一个true和一个false。

产生差异的原因是,在JDK 6中,intern()方法会把首次遇到的字符串实例复制到永久代的字符串常量池中存储,返回的也是永久代里面这个字符串实例的引用,而由StringBuilder创建的字符串对象实例在Java堆上,所以必然不可能是同一个引用,结果将返回false。

而JDK 7(以及部分其他虚拟机,例如JRockit)的intern()方法实现就不需要再拷贝字符串的实例 到永久代了,既然字符串常量池已经移到Java堆中,那只需要在常量池里记录一下首次出现的实例引 用即可,因此intern()返回的引用和由StringBuilder创建的那个字符串实例就是同一个。而对str2比较返 回false,这是因为“java” [2]这个字符串在执行String-Builder.toString()之前就已经出现过了,字符串常量 池中已经有它的引用,不符合intern()方法要求“首次遇到”的原则,“计算机软件”这个字符串则是首次 出现的,因此结果返回true。

这个intern()的用法确实与我们想象的不太一样

下面是我的测试用例,看完可以帮助更好的理解

public class RuntimeConstantPoolOOM {public static void main(String[] args) {String A = "计算机软件";String B = new String("计算机软件");//此时B首次出现在字符串常量池的地址就是A,因此返回trueSystem.out.println(A == B.intern());String str1 = new StringBuilder("计算机").append("软件").toString();//此时str1首次出现的位置是与A相同的,A的地址与str1不同,因此返回false。//但是如果我们在上文中不定义A,那么这个判断就会返回trueSystem.out.println(str1.intern() == str1);//验证str1与A的地址在字符串常量池中是相同的,输出trueSystem.out.println(A == str1.intern());//B在字符串常量池中的地址也与A的地址相同,也与str1.intern相同,返回trueSystem.out.println(B.intern() == str1.intern());String str2 = new StringBuilder("ja").append("va").toString();//这个是因为在我们看不到的地方,java这个字符串就已经存在了,第一次的地址不知道,因此返回了falseSystem.out.println(str2.intern() == str2);//我们再来看一个例子,此时输出的就是true了,因为”学习计算机“这个字符串第一次出现在字符串常量池,两个地址是相同的String D = new StringBuilder("学a习").append("计算机").toString();System.out.println(D.intern() == D);}
}

输出结果如图

 

http://www.lryc.cn/news/122694.html

相关文章:

  • idea报“Could not autowire. No beans of ‘UserMapper‘ type found. ”错解决办法
  • QEMU源码全解析35 —— Machine(5)
  • SpringBoot对一个URL通过method(GET、POST、PUT、DELETE)实现增删改查操作
  • webpack 创建VUE项目
  • deepin 深度操作系统正式适配苹果 M1 芯片
  • Labview控制APx(Audio Precision)进行测试测量(七)
  • Mybatis 源码 ② :流程分析
  • Unity2D RPG开发笔记 P1 - Unity界面基础操作和知识
  • 聚类与回归
  • 了解IL汇编循环
  • 电脑突然黑屏的解决办法
  • socket练习
  • Gitlab CI/CD笔记-第二天-主机套接字进行构建并push镜像。
  • nginx服务器报错502 Bad Gateway的原因以及解决办法
  • 带你了解什么是内容协商---如何返回不同媒体类型的数据
  • 容器化相关面试题
  • BIO、NIO、AIO 有什么区别
  • 如何构建一个对象池并使用
  • 【沁恒蓝牙mesh】CH58x USB功能开发记录(三)
  • 2023国赛数学建模D题思路分析
  • linux 学习————LNMP之分布式部署
  • 第八课 双重所有格和不定代词
  • 使用xrdp协议远程桌面控制树莓派,无需公网IP!
  • 数据结构【图的类型定义和存储结构】
  • PHP Smarty如何进行调试和错误处理?
  • 手搓vue3组件_0,打包配置
  • WebAssembly
  • TM4C123库函数学习(2)--- LED闪烁,滴答定时器精准延时
  • Linux: network: tcp: back-off技术
  • 36 | 银行贷款数据分析