哈希表這個數據結構想必大多數人都不陌生,並且在不少地方都會利用到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
hashCode相等 equals未必相等對象
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; }