淺談java hashCode

 哈希表這個數據結構想必大多數人都不陌生,並且在不少地方都會利用到hash表來提升查找效率。在Java的Object類中有一個方法:java

public native int hashCode();

根據這個方法的聲明可知,該方法返回一個int類型的數值,而且是本地方法,所以在Object類中並無給出具體的實現。數據結構

1、hashCode做用ide

對於包含容器類型的程序設計語言來講,基本上都會涉及到hashCode。在Java中也同樣,hashCode方法的主要做用是爲了配合基於散列的集合一塊兒正常運行,這樣的散列集合包括HashSet、HashMap以及HashTable。this

  爲何這麼說呢?考慮一種狀況,當向集合中插入對象時,如何判別在集合中是否已經存在該對象了?(注意:集合中不容許重複的元素存在)spa

  也許大多數人都會想到調用equals方法來逐個進行比較,這個方法確實可行。可是若是集合中已經存在一萬條數據或者更多的數據,若是採用equals方法去逐一比較,效率必然是一個問題。此時hashCode方法的做用就體現出來了,當集合要添加新的對象時,先調用這個對象的hashCode方法,獲得對應的hashcode值,實際上在HashMap的具體實現中會用一個table保存已經存進去的對象的hashcode值,若是table中沒有該hashcode值,它就能夠直接存進去,不用再進行任何比較了;若是存在該hashcode值, 就調用它的equals方法與新元素進行比較,相同的話就不存了,不相同就散列其它的地址,因此這裏存在一個衝突解決的問題,這樣一來實際調用equals方法的次數就大大下降了,說通俗一點:Java中的hashCode方法就是根據必定的規則將與對象相關的信息(好比對象的存儲地址,對象的字段等)映射成一個數值,這個數值稱做爲散列值。設計

2、hashCode和equals
code

對象未重寫equals和hashCode方法orm

  1. hashCode相等 equals未必相等對象

  2. equals相等hashCode必然相等get

若是重寫equals方法最好同時重寫hashCode方法保證在邏輯上二者相等,否則在散列集合中保存相同可能存在問題

重寫hashCode和equals

 @Override
    public int hashCode() {
        // TODO Auto-generated method stub
        return name.hashCode()*37+age;
    }
     
    @Override
    public boolean equals(Object obj) {
        // TODO Auto-generated method stub
         if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (this.getClass() != obj.getClass()) {
            return false;
        }
         
        People p = (People)obj;
        return this.name.equals(((People)obj).name) && this.age== ((People)obj).age;
    }
相關文章
相關標籤/搜索