我们用一个经典的例子来理解

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”在之前就已经被加入到了常量池中。

最新文章

  1. 51nod1073(约瑟夫环)
  2. git检出与创建的过程
  3. failed to push some refs to 'git@github.com:***.git' hint: Updates were rejected b
  4. FLAG_ACTIVITY_CLEAR_TOP
  5. SharePoint 2013异常信息的查看
  6. java之StringBuffer类详解
  7. YARN内存使用优化配置
  8. 我的新计划 《2Dof Racing Simulator》2014/3/9 20:30:00
  9. cacti气象图调整(批量位置调整、更改生成图大小等)
  10. 《javascript语言精粹》——第3章对象
  11. 微信小程序开发 -- 01
  12. 关于java中用itext导出word的一点想法
  13. 剑指offer(一)
  14. linux kvm虚拟机使用
  15. java常用数据类型使用Day008
  16. Unity Editor 下创建Lua和Text文件
  17. docker 导出导入镜像
  18. [国家集训队]JZPFAR
  19. bzoj3545 Peaks
  20. delphi ios info.plist

热门文章

  1. python 小脚本升级-- 钉钉群聊天机器人
  2. spring boot 遇到 supported setting property http://xml.org/sax/properties/lexical-handler
  3. C# 字符串的连接
  4. popupwindow那些坑
  5. Python学习_07_错误、异常
  6. umask的作用[转]
  7. python打开一个本地目录文件路径
  8. Micropython实战之TPYBoardv102 DIY金属检测仪
  9. Java学习笔记18(Object类)
  10. Windows程序设计学习笔记(一)Windows内存管理初步