String对象和引用
String对象的位置存在于堆(非常量池区域), 而字符串常量池则存放字面量加载时创建的对象的引用,根据创建方式的不同,创建过程也有可能不同,详细见下方描述
主要创建方式
在对象创建前,都会检查相应字面量(比如"abc")是否被加载,若没有,则会在堆里创建一个新的String对象,内容为"abc",然后在字符串常量池中声明一个引用指向该对象,最后进行对象的创建,主要创建方式如下:
String s = "abc"
String s=new String("abc")
String s = new String("abc").intern()
String s="a"+"b"
String s=new String("a")+new String("b")
在实际应用中,比如new StringBuilder("abc").toString(),s.concat("abc"),等都会在堆中new一个对象,在调用intern()时,若加载了字面量,则直接返回字符串常量池中已经存在的那个对象引用, 若在运行时才确定,则将当前对象的引用直接存入常量池
练习
问题1: String s=new String("abc")的过程
答:首先会检查相应字面量("abc")是否被加载,若没有,则会在堆里创建一个新的String对象,内容为"abc",然后在字符串常量池中声明一个引用指向该对象,最后会在堆中new一个新的对象,并返回其引用
注意:创建过程中,若"abc"没被加载,最终在堆中创建了两个对象,否则,只new了一个对象
问题2: String s1 = "abc",String s2=new String("abc"),String s3=new String("abc").intern() 那么s2==s3? s1==s3?
答:s2!=s3,s1==s3




