在分析了hashCode方法和equals方法之後,我們對hashCode方法和equals方法的相關作用有了大致的瞭解。在通過查看HashMap類的相關源碼的時候,發現其中存在一個int hash(int h)的方法。在HashMap中該方法的源碼如下: &em ...
在分析了hashCode方法和equals方法之後,我們對hashCode方法和equals方法的相關作用有了大致的瞭解。在通過查看HashMap類的相關源碼的時候,發現其中存在一個int hash(int h)的方法。在HashMap中該方法的源碼如下:
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
通過該方法的相關註釋我們可以得知,該方法的作用是確保在每個比特位置上僅與恆定倍數不同的散列碼具有有限數量的衝突(在預設載入因數下大約為8)。簡而言之,就是通過位運輸的方式,使得每個位儘可能的都參與運算,從而減少在調用put方法時存儲相關信息的hash衝突。而在HashMap中,hash方法是配合著indexFor方法進行使用的。indexFor方法的相關源碼如下:
static int indexFor(int h, int length) {
return h & (length-1);
}
從中可以看出,當在存儲的相關鍵值信息的時候,如果不先調用hash方法對所得的hashCode方法的返回值進行運算的話,會產生較大的衝突,從而使得其插入和查找的效率降低。