intern()
intern方法的作用是:如果字符串常量池中已经包含一个字符串等于此String对象的字符串,则返回常量池中的这个String对应的对象,
否则将其添加到常量池并返回常量池中的引用。
在jdk1.7以后,就不会像之前那样把String对象复制到常量池,而仅仅复制堆中String对象的引用至常量池。
public class RuntimeConstantPool { public static void main(String[] args) { //放在了堆中 String tr1=new StringBuilder("常量").append("池").toString(); //将"常量池"这个字符串的引用放入常量池 String tr2=tr1.intern(); System.out.println(tr2==tr1); String st=new StringBuffer("jav").append("a").toString(); //"java"这个字符串已经存在在常量池里 String st2=st.intern(); System.out.println(st2==st); } }
故这段代码在1.7+版本运行为true,false,在1.6-则为 false,false。
常量池的位置
JAK1.6在方法区
JAK1.7放在堆里面
JAK1.8以后放在一个独立空间里面,叫做“元空间”