String的intern方法
(jdk 7 以上) String s = new String("a") + new String("b"); s.intern(); 执行 如果不存在,会把当前引用放到常量池,该引用指向着 所以: // 例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 通过上面例子也可以知道:字符串是在执行 在 jdk 6 以及以前版本有个永久代(PermGen),是方法区的实现(字符串常量池存储在永久代里;但不是都在永久代)。永久代与堆空间是隔开的,所以在这些版本里执行例1代码,会返回 false,因为堆地址和永久代中的地址是不同的。 jdk 7 开始,逐渐不使用永久代,把方法区一些数据(包括字符串常量池)放到了堆空间里。 而 jdk 8 开始,移除永久代,新建立了元区域(Metaspace),也是方法区的一种实现,区别是元区域使用的是本地内存。但字符串常量池、静态变量等还是在堆里。 注:方法区是 JVM 规范中的概念,用于存储类信息、常量池、静态变量、JIT编译后的代码等数据,具体放在哪里,不同的实现可以放在不同的地方。永久代就是 Hotspot 对方法区的实现,其他 JVM 没有永久代。 https://www.zhihu.com/question/49044988 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |