Object 和 String 的equals比較

先看一段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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章