String.intern() (jdk1.8)】的更多相关文章

1.通过字面量赋值创建字符串 (如:String str=”aaa”)时,会先在常量池中查找是否存在相同的字符串,若存在,则将栈中的引用直接指向该字符串:若不存在,则在常量池中生成一个字符串,再将栈中的引用指向该字符串. String a1 = "AA";//在常量池上创建常量AA String a2 = "AA";//直接返回已经存在的常量AA System.out.println(a1 == a2);//true 2.new String创建字符串 在堆上创建对…
字符串常量池也是运行时常量池 jdk1.6中,它是在方法区中,属于“永久代” jdk1.7中,它被移除方法区,放在java堆中 jdk1.8中,取消了“永久代”,将常量池放在元空间,与堆独立了 public class RuntimeConstantPoolOOM { public static void main(String[] args) throws Exception{ String str1 = new StringBuffer("计算机").append("sh…
字符串常量池在jdk升级过程中发生了一些变化 在JDK1.6中,它在方法区中,属于“永久代”. 在JDK1.7中,它被移除方法区,放在java堆中. 在JDK1.8中,取消了“永久代”,将常量池放在元空间,与堆独立 jdk1.6中,intern()方法会把首次遇到的字符串示例复制到永久代中,返回的也是永久代中这个字符串实例的引用 jdk1.6以后,对于实例,intern()方法不会再复制实例,只是在常量池中记录首次出现的实例引用,对于字符串仍然是加入字符串常量 比如下面这段代码,这段代码在常量池…
原文出处: codelog.me 大家知道,Java中string.intern()方法调用会先去字符串常量池中查找相应的字符串,如果字符串不存在,就会在字符串常量池中创建该字符串然后再返回. 字符串常量池是一个固定大小的HashMap,桶的数量默认是1009, 从Java7u40开始,该默认值增大到60013.在Java6当中,字符串常量池是放在Perm空间的,从Java7开始,字符串常量池被移到Heap空间.下面,我们通过测试程序来窥探字符串常量池在Java6,Java7两个不同版本底下的内…
JDK7将String常量池从Perm区移动到了Java Heap区.在JDK1.6中,intern方法会把首次遇到的字符串实例复制到永久代中,返回的也是永久代中的实例.但是在JDK1.7以后,String.intern()方法不会在复制实例,只是在常量池中记录首次出现的实例引用.下面来看一些具体例子. 案例一: String str1 = new String("计算机") + new String("软件"); System.out.println(str1.i…
运行时常量池概述 Java运行时常量池中主要存放两大类常量:字面量和符号引用.字面量比较接近于Java语言层面的常量概念,如文本字符串.声明为final的常量值等. 而符号引用则属于编译原理方面的概念,包括了下面三类常量: - 类和接口的全限定名(包名+类名) - 字段的名称和描述符 - 方法的名称和描述符 运行时常量池位置 运行时常量池在JDK1.6及之前版本的JVM中是方法区的一部分,而在HotSpot虚拟机中方法区放在了"永久代(Permanent Generation)".所以…
在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.intern()返回引用的测试. 总结一句话: jdk1.7之前,调用intern()方法会判断常量池是否有该字符串,有,返回常量池引用,没有,常量池中创建并返回引用给intern方法. jdk1.7之后,调用intern()方法会判断常量池是否有该字符串,有,返回常量池引用,没有,常量池中保存当前对象的引用. 其实要搞明白String.intern(),我总结了下面几条规则: 一.jdk1.7之前,new String都是…
一个初始为空的字符串池,它由类 String 私有地维护. 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串.否则,将此 String 对象添加到池中,并返回此 String 对象的引用. 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true. 所有字面值字符串和字符串赋值常量表达式都使…
https://blog.csdn.net/soonfly/article/details/70147205 在翻<深入理解Java虚拟机>的书时,又看到了2-7的 String.intern()返回引用的测试. 其实要搞明白String.intern(),我总结了下面几条规则: 一.new String都是在堆上创建字符串对象.当调用 intern() 方法时,编译器会将字符串添加到常量池中(stringTable维护),并返回指向该常量的引用.  二.通过字面量赋值创建字符串(如:Stri…
在Java虚拟机(以下简称JVM)中,类包含其对应的元数据,比如类的层级信息,方法数据和方法信息(如字节码,栈和变量大小),运行时常量池,已确定的符号引用和虚方法表. 在过去(当自定义类加载器使用不普遍的时候),类几乎是“静态的”并且很少被卸载和回收,因此类也可以被看成“永久的”.另外由于类作为JVM实现的一部分,它们不由程序来创建,因为它们也被认为是“非堆”的内存. 在JDK8之前的HotSpot虚拟机中,类的这些“永久的”数据存放在一个叫做永久代的区域.永久代一段连续的内存空间,我们在JVM…