一些相關概念:
1、散列技術是在記錄的存儲位置和它的關鍵字之間建立一個確定的應關系f,使得每個關鍵字key對應一個存儲位置f(key)。查找時根據這個對應關系找到給定值key的映射f(key)。那么這個f成為散列函數,又成為哈希函數。(hash,表面上存key在散列表中的位置)。
2、散列技術將記錄存儲在一塊連續的存儲空間中,這塊連續的存儲空間成為哈希表。
3、散列技術既是存儲方法,也是查找方法。
散列技術兩大關鍵:1、散列函數簡單、均勻、存儲利用率高 2、雖然關鍵字不同,但有一樣的散列函數 ----沖突
優秀博客:httpa://www.cnblogs.com/dolphin0520/p/3681042.html
重要的邏輯關系:因此有人會說,可以直接根據hashcode值判斷兩個對象是否相等嗎?肯定是不可以的,因為不同的對象可能會生成相同的hashcode值。雖然不能根據hashcode值判斷兩個對象是否相等,但是可以直接根據hashcode值判 斷兩個對象不等,如果兩個對象的hashcode值不等,則必定是兩個不同的對象。如果要判斷兩個對象是否真正相等,必須通過equals方法。
也就是說對於兩個對象,如果調用equals方法得到的結果為true,則兩個對象的hashcode值必定相等;
如果equals方法得到的結果為false,則兩個對象的hashcode值不一定不同;
如果兩個對象的hashcode值不等,則equals方法得到的結果必定為false;
如果兩個對象的hashcode值相等,則equals方法得到的結果未知。
看源碼: JDK1.8 hashcode源碼:
static final int hash(Object key) {
int h;
////代表無符號二進制字節右移16位,右移位,不足補0;如果h為-,那么用補碼表示
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
//其實object的hashcode是本地方法實現的,也就是說Object沒有實現,那么 public native int hashCode();
//也就只給出了使用hashcode時,要和equal配合使用的注意事項
//那么,每個類比如String都有自己的hashcode實現方式,而且實現方式都不同!!!!主要是要和equal相配合
public final int hashCode() {
return Objects.hashCode(key) ^ Objects.hashCode(value);
}