先看一段代码:
public class App {
public static void main(String args[]) {
String s1 = "Hello Java";
String s2 = "Hello Java";
String s3 = new String("Hello Java");
System.out.println(s1==s2);//true
System.out.println(s2==s3);//false
System.out.println(s1==s3);//false
System.out.println(s1.equals(s3));//true
}
}
运行结果上来看,在String类中,每生成一个新内容的字符串时,他们都被添加到一个共享池中,当再次通过“=”号生成同样内容的字符串实例时,就共享此对象,判断依据是String类equals(Object obj)方法的返回值,也就是说执行
String s1 = “Hello Java”;
String s2 = “Hello Java”;
这两行代码时,只创建了一个对象;
当执行String s3 = new String(“Hello Java”)时,调用了String的构造器:public String(String original){},使用new创建了一个对象,并将它的引用赋值给了s3变量,同时参数“Hello Java”也是一个String对象。也就是说
String s3 = new String(“Hello Java”);
创建了两个对象;
其中值的比较和引用比较参考:http://blog.csdn.net/csfreebird/article/details/1791311