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(s2==s3);
}
以上的代码输出什么呢,在此过程中又创建了多少个对象?
要明确以上的问题,要了解string创建对象的过程和原理才行。
1、在创建s1对象的时候,首先会在string pool中查询是否具有要创建的对象,因为在执行这一句代码前并没执行任何语句,所以在string pool中并没有abc对象,那么java会在string pool中初始化一个abc对象,然后将此abc对象拷贝一份放入java堆内存中,s1指向堆内存中的abc,此过程中一共创建了两个对象
2、在创建s2对象时,依然首先在string pool中查找,发现存在目标对象,将s2指向该对象,此过程并没有创建新的对象
3、在创建s3对象时,依然首先在string pool中查找,发现存在目标对象,于是将该对象拷贝一份放入java堆内存中,将s3指向该对象。该过程创建了一个新对象
到目前为止,内存中的对象分配与引用情况如下图:
因为java中的==比较的是对象的引用,所以,以上程序应该输出的全是false