详解String类中的intern()方法
2024-10-14 09:03:22
我们用一个经典的例子来理解
package com.jvm.heap; public class MyTest {
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); String str3 = new StringBuilder("1.8.0_111").toString();
System.out.println(str3.intern() == str3); String str4 = new StringBuilder("ja").append("ee").toString();
System.out.println(str4.intern() == str4); }
}
true
false
false
true
String中的intern()方法,这个方法要注意的是JDK 1.6中运行,会得到两个false,而JDK 1.7中运行,会得到一个true和一个false。产生的原因是:在JDK1.6中,intern()方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中这个字符实例的引用,而由StringBuilder创建的字符串实例在Java堆上,所以必然不同一个引用,将返回false。而JDK1.7开始以后JVM 取消了永生代,取而代之的是元空间,所以intern()实现不会再复制实例,只是把常量池中记录首次出现的实例引用,因此intern()返回的引用和 StringBuilder创建的那个字符串实例是同一个,对str2 比较返回 false是因为“java”这个字符串在执行 StringBuilder.toString()之前就已经出现过。我们最后发现java这个字符串在System类中被初始化
根据注释可以看出来,System是有虚拟机自动调用,在initializeSystemClass方法中发现调用了Version对象的init静态方法,而在Version类中可以找到私有静态字符串常量 java等
所以可以说明“java”在之前就已经被加入到了常量池中。
最新文章
- 51nod1073(约瑟夫环)
- git检出与创建的过程
- failed to push some refs to 'git@github.com:***.git' hint: Updates were rejected b
- FLAG_ACTIVITY_CLEAR_TOP
- SharePoint 2013异常信息的查看
- java之StringBuffer类详解
- YARN内存使用优化配置
- 我的新计划 《2Dof Racing Simulator》2014/3/9 20:30:00
- cacti气象图调整(批量位置调整、更改生成图大小等)
- 《javascript语言精粹》——第3章对象
- 微信小程序开发 -- 01
- 关于java中用itext导出word的一点想法
- 剑指offer(一)
- linux kvm虚拟机使用
- java常用数据类型使用Day008
- Unity Editor 下创建Lua和Text文件
- docker 导出导入镜像
- [国家集训队]JZPFAR
- bzoj3545 Peaks
- delphi ios info.plist
热门文章
- python 小脚本升级-- 钉钉群聊天机器人
- spring boot 遇到 supported setting property http://xml.org/sax/properties/lexical-handler
- C# 字符串的连接
- popupwindow那些坑
- Python学习_07_错误、异常
- umask的作用[转]
- python打开一个本地目录文件路径
- Micropython实战之TPYBoardv102 DIY金属检测仪
- Java学习笔记18(Object类)
- Windows程序设计学习笔记(一)Windows内存管理初步