码迷,mamicode.com
首页 > 其他好文 > 详细

String的intern方法

时间:2019-09-04 19:16:34      阅读:120      评论:0      收藏:0      [点我收藏+]

标签:字节   代码   perm   不同的   java   概念   jit   永久   intern   

(jdk 7 以上)

String s = new String("a") + new String("b");
s.intern();

执行 s.intern() 时,如果字符串 ab 已经在常量池中,则直接返回;

如果不存在,会把当前引用放到常量池,该引用指向着 s 指向的堆中的对象。

所以:

// 例1
String s = new String("a") + new String("b");
s.intern();
String s2 = "ab"; // 此时s2实际指向的是s
System.out.println(s == s2); // 所以是true


// 例2
String s = new String("a") + new String("b");
String s2 = "ab";
s.intern();
System.out.println(s == s2); // false

通过上面例子也可以知道:字符串是在执行 ldc 字节码指令时放到常量池的,而不是类加载期间事先放到常量池。

在 jdk 6 以及以前版本有个永久代(PermGen),是方法区的实现(字符串常量池存储在永久代里;但不是都在永久代)。永久代与堆空间是隔开的,所以在这些版本里执行例1代码,会返回 false,因为堆地址和永久代中的地址是不同的。

jdk 7 开始,逐渐不使用永久代,把方法区一些数据(包括字符串常量池)放到了堆空间里。

而 jdk 8 开始,移除永久代,新建立了元区域(Metaspace),也是方法区的一种实现,区别是元区域使用的是本地内存。但字符串常量池、静态变量等还是在堆里。

注:方法区是 JVM 规范中的概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。永久代就是 Hotspot 对方法区的实现,其他 JVM 没有永久代。

知乎:方法区的Class信息,又称为永久代,是否属于Java堆?

String的intern方法

标签:字节   代码   perm   不同的   java   概念   jit   永久   intern   

原文地址:https://www.cnblogs.com/dmsdus/p/11460916.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!