下列程序会输出什么结果:
public class StringTest {
public static void main(String[] args){
String s1 = new String("abc");//构建了两个对象
String s2 = "abc"; //没有新的对象生成
String s3 = new String("abc");//构建了一个新的对象
System.out.println(s1==s2);
System.out.println(s1==s3);
System.out.println(s3==s2);
}
}
正确的结果是:false
false
false
在String s1 = new String("abc")中,会构建几个对象,一般我们会说构建了一个String对象,其实构建了两个 对象,一个是String池上的对象,一个是堆上的堆对象。首先会去String池中查有没有“abc”这么一个对象,有的话就不在构建,在本程序中第一次构建String对象时候,String池中没有该对象,所以会先在String池中构建这么一个对象,然后因为关键字new 而去堆上构建一个堆对象。所以会构建两个对象。
String s2 ="abc"中首先去string池中查看是否存在“abc”对象,发现存在所以不够建新的对象。因为没有关键字new 所以不再在堆上构建新的对象。
String s3 = new String("abc")先去池中发现存在对象,所以不再在池中构建新的对象,但是因为关键字new 所以在对上再次构建一个新的堆对象。
综上所述,s1是对堆对象的一个引用,s2是对池中对象的引用,s3是对另一个堆对象的引用