【使用new关键字实例化对象】会在String常量池中创建对象(String常量池中还不存在要创建的字符串对象的前提下),之后再到堆中创建字符串对象,最后返回的引用是堆内存中对象的地址。如果要求返回的引用变成常量池中的引用,那么要使用intern()方法。
观察intern()方法
public class Hello {
public static void main(String[] args) {
//声明两个字符串对象
String s1= "abcd";//常量池
String s2=new String("abcd");//堆
String s3=s2.intern();//将s2入池
System.out.println(s1==s2);
System.out.println(s1==s3);
}
}
String常量池在哪儿
在jdk1.7版本的时候String常量池是在方法区中的,到了jdk1.8版本的时候移到了堆中了。
证明String常量池的位置
本次证明会涉及到jvm的一些参数问题。
堆内存溢出,String常量池是在堆中的。
常量池的好处
String常量池出现之后保证了相同内容的字符串只占用一块空间,实现字符串对象共享。