一、==
对于基本数据类型:比较的是两个变量的值是否相等
对于引用数据类型:比较的是两个地址是否相等
String s="gong";
String y="gong";
System.out.println(s==y);//结果为ture
在这种情况:将字符串“"gong"赋值给变量s时,会去常量池中寻找有没有“gong”这个字符串,如果常量池中有该字符串,就将s指向该字符串在常量池中的地址。如果没有,则需要在常量池中创建“gong”这个字符串。
而在第二次赋值中,将字符串"gong"赋值给y时,常量池中已经有该字符串,所以不需要重新创建,之间将字符串“gong"的地址赋给y即可;所以y==s为ture
String a= new String("gong");
String b= new String("gong");
System.out.println(a==b);//结果为:false
当我们要创建一个字符串对象时:首先会去常量池中找“gong”,如果找到了再创建一个”gong”对象存到堆中,并且他的值指向堆中的”gong”,如果没有找到则先在常量池中创建”gong”,再在堆内存开辟一块内存空间创建”gong”,并且他的值指向堆中的”gong”
二、equals(只能判断两个对象是否相等,或者判断字符串是否相等)
String a= new String("gong");
String b= new String("gong");
System.out.println(a==b);//结果为:false
System.out.println(a.equals(b));//结果为:ture
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
看完源代码你可能就会明白了,原来是String重写了equals方法,将之前的引用比较改成了值比较