先看一段String 和 一個普通類的equals方法的比較
/**
* Object 中的equlas的使用
* @author dell
*
*/
public class TestEquals {
public static void main(String [] args){
/** ================== String中有重寫的equals===========================*/
String str1 = new String("123");
String str2 = new String("123");
System.out.println(str1.equals(str2)); //out:true
System.out.println(str1.equals(str1)); //out:true
/**==================== Dog中沒有重寫equals ========================= */
//dog1 與 dog2 的變量值相同
Dog dog1 = new Dog("dog");
Dog dog2 = new Dog("dog");
System.out.println(dog1.equals(dog2)); //out:false
//dog1與dog2的變量引用相同
dog1.name = dog2.name;
System.out.println(dog1.equals(dog2)); //out:false
//dog1與dog2的引用相同
dog1 = dog2;
System.out.println(dog1.equals(dog2)); //out:true
/**==================== Cat中重寫equals,比較Cat中name屬性 ========================= */
Cat cat1 = new Cat("cat");
Cat cat2 = new Cat("cat");
System.out.println(cat1.equals(cat2)); //out:true
}
}
/**
* Dog 中的沒有equals方法的重寫
* @author dell
*
*/
public class Dog {
String name;
public Dog(String name){
this.name = name;
}
}
/**
* Cat 重寫了equals方法
* @author dell
*
*/
public class Cat {
String name;
public Cat(String name){
this.name = name;
}
@Override
public boolean equals(Object anoObject) {
if (this == anoObject) { // 如果兩個對象的引用相同
return true;
}
if (anoObject instanceof Cat) {
Cat anoCat = (Cat) anoObject;
if(this.name.equals(anoCat.name)){
return true;
}
}
return false;
}
}
str1和str2的值相等,String的equals在字符串中比較的是對象的值,不是引用,和==有區別,這裏不做解釋
第一個輸出是true,equals比較String對象中的值,兩個都是"123",所以輸出true
同樣的寫法,爲什麼輸出比較兩個dog的時候輸出卻是false
Dog是Object 的子類,String也是Object的子類,區別在於String中重寫了Object中的equals方法
下面附上String和Object 的源碼
/**
* String 的equals方法
*/
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = count;
if (n == anotherString.count) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while (n-- != 0) {
if (v1[i++] != v2[j++])
return false;
}
return true;
}
}
return false;
}
/**
* Obejct中的equals方法
*/
public boolean equals(Object obj) {
return (this == obj);
}
String的equals方法中先是判斷兩個對象的引用是否相同,在判斷字符串的長度是否相同,然後判斷每個字符串相同...
而Object中的equals只判斷對象的引用是否相同,如果引用不同直接返回false
所以說當dog1對象使用equals方法時候調用的Object 中的equals方法,判斷的是dog1和dog2的引用是否相等
當然不相等,所以輸出false
再看Cat類,Cat類中實現了對Object 方法的重寫,判斷Cat中的name屬性的值是否相等。而不是判斷兩個cat對象的引用是否相等
所以輸出true