==
对于基本类型和引用类型,
- 基本类型:比较的是值是否相同
- 引用类型:比较的是引用是否相同,也就是比较的是引用指向的地址值。
equals()
其实最本质上,equals() 与 == 是一样的,比较的是引用是否相等。只是String类将equals()重写了,才比较的是“内容”。 equals()源码如下:
public boolean equals(Object obj) {
return (this == obj);
}
再来看看下面的Person类,没有重写equals()方法:
public class Person {
private String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
经过测试,输出结果为false:
public class Test {
public static void main(String[] args) {
Person p1 = new Person("willow");
Person p2= new Person("willow");
System.out.println(p1.equals(p2));//false
}
}
因为p1,p2是Person的两个实例化的引用,地址值不同,所以输出为false。
再来看看String的equals()源码,先将两个字符串转换成字符数组,然后一个一个字符比较,一旦出现对应的第i个字符不相等,就返回false;字符数组遍历结束,都相等的话就返回true,代码如下:
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;
}
所以经过测试,返回结果true:
public class Test {
public static void main(String[] args) {
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1.equals(s2));//true
}
}