顾名思义,Java 中的字符常量串池( String Pool )是一个存储在 Java 堆内存中的字符串池。 我们知道 String 是 java 中的特殊类,我们可以使用 new 操作创建 String 对象,也可以使用双引号来创建 String 对象.
字符串常量池在哪里?
字符串常量池 ( String Pool )存在于方法区
在分析字符串常量池的位置时,首先了解一下堆、栈、方法区:
-
堆
存储的是对象,每个对象都包含一个与之对应的class
JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定 -
栈
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)
每个栈中的数据(原始类型和对象引用)都是私有的
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失 -
方法区
静态区,跟堆一样,被所有的线程共享
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量
哪些String对象存放在字符串常量池( String Pool )中?
- 1.字面值字符串
- 2.字符串赋值常量表达式
- 3.使用 intern 方法对String对象进行操作返回的String对象
String st1 = "yveshe1";
String st2 = new String("yveshe2");
String st = st1 + "hello";
String internStr = st.intern();
System.out.println(st == internStr);
分析:
首先,字面值字符串
有: yveshe2
, hello
其次,使用字符串赋值表达式
有:String st1=yveshe1
最后,使用intern方法的有:String internStr = yveshe1hello
对象st1 在常量池中
对象st2 不在常量池中
对象st 不在常量池中
对象internStr JDK6在常量池中,JDK7则是使用的st的实际地址,只在常量池中保存了引用.
输出结果: JDK6输出结果为false,JDK7输出结果为true.
相关: String的intern()方法的作用是什么?
相关: 深入解析String#intern(JDK6和JDK7的异同)
参考:
https://segmentfault.com/a/1190000009888357#articleHeader0’
http://www.importnew.com/10756.html