equals()和hashCode()的區別

fan_rockrock發表於2016-02-14
1、為什麼要過載equal方法?

     答案:因為Object的equal方法預設是兩個物件的引用的比較,意思就是指向同一記憶體,地址則相等,否則不相等(跟==是一個意思);如果你現在需要利用物件裡面的值來判斷是否相等,則過載equal方法。

       特別注意:String重寫了equals方法,是按照其字串的值來比較的


2、 為什麼過載hashCode方法?
   答案:一般的地方不需要過載hashCode(hashCode預設是取物件的地址來做運算),只有當類需要放在HashTable、HashMap、HashSet等等hash結構的集合時才會過載hashCode,因為這需要大量的比較操作,用equals會花費大量時間,而用hashcode則會大大節省時間

       這種Hash比較演算法是這樣操作的:

       <1>、 通過hashCode查到小記憶體塊的地址,如果hashCode不同,直接返回false(表明這兩物件不相等),若相同,則進行第二步;
       <2>、通過equals方法(可能是重寫過的)來比較兩物件,若相等,則表明兩物件相等;若不等,則表示不相等


3、例子

<span style="font-size:14px;">import java.util.HashMap;
import java.util.Map;
 

public final class TestEqualHashcode {
 
    public static void main(String[] args) {
        Map m = new HashMap();
        m.put(new PhoneNumber(020, 12345678), "shellfeng");
        System.out.println(m.get(new PhoneNumber(020, 12345678)));
    }
 
    private static class PhoneNumber {
       
        private short areaCode;
 
       
        private short extension;
 
        public PhoneNumber(int areaCode, int extension) {
            this.areaCode = (short) areaCode;
            this.extension = (short) extension;
        }
 
        public boolean equals(Object o) {
            if (o == this) {//若物件是其本身,則返回true
                return true;
            }
            if (!(o instanceof PhoneNumber)) {
                return false;
            }
            PhoneNumber pn = (PhoneNumber) o;
            return pn.extension == extension && pn.areaCode == areaCode;
        }
      
        public int hashCode() {
            int result = 17;
            result = 32 * result + areaCode;
            result = 32 * result + extension;
            return result;
        }
    }
}</span>

當註釋掉hashCode()或者equals()任意一個時,都得不到結果!


相關文章