Java HashMap原始碼分析

2021-07-12 04:32:44 字數 1499 閱讀 1185

hashset和hashmap是相同的實現

主要分析hashmap

hashmap實現了map介面,允許放入null元素,與hashtable的主要區別是沒有實現執行緒安全,與treemap的主要區別是不能保證元素的順序,因此,不同時間迭代會得到不同的位置,hashmap是用衝突鍊錶法解決衝突

根據上圖,兩個關鍵的引數是可以影響hashmap的效能的:初始容量(initial capacity)和負載係數 (load factor)。初始容量指定了初始table的大小,負載係數用來指定自動擴容的臨界值。

將物件放入hashmap或者hashset時:hashcode()和equals()。hashcode()方法決定了物件會被放到哪個bucket裡,當多個物件的雜湊值衝突時,equals()方法決定了這些物件是否是「同乙個物件」。

方法剖析:

get()

get(object key) 該方法是根據指定的key返回對應的value,該方法呼叫了getentry(object key)得到相應的entry,然後返回entry.getvalue()。

//getentry()方法

final entrygetentry(object key)

return

null;

}

put()

put(k key, v value)方法是將指定的key,value對新增到map裡,該方法首先會對map做一次查詢,看是否包含該元祖,如果包含就返回,查詢過程類似於getentry()方法;如果沒有找到,則會通過addentry(int hash, k key, v value, int bucketindex)方法插入新的entry,

//addentry()

void addentry(int hash, k key, v value, int bucketindex)

//在衝突鍊錶頭部插入新的entry

entrye = table[bucketindex];

table[bucketindex] = new entry<>(hash, key, value, e);

size++;

}

remove()

remove(object key)的作用是刪除key值對應的entry,該方法的具體邏輯是在removeentryforkey(object key)裡實現的,首先找到key值對應的entry,然後在刪除entry(修改鍊錶的相應指標)。類似於查詢,但是比查詢多了刪除修改指標的部分。

//removeentryforkey()

final entryremoveentryforkey(object key)

prev = e;

e = next;

}return e;

}

Java HashMap原始碼小結

本文基於jdk1.8.hashmap即雜湊表,是一種能以常數平均時間完成插入,刪除和查詢操作的資料結構 雜湊表有兩種實現方式 開放位址方式和衝突鍊錶方式 開放位址方式不需要使用鍊錶,但是要頻繁的再雜湊操作,常用的再雜湊方法有線性探測法,平方探測法,雙雜湊法。衝突鍊錶方式將所有雜湊值相同的鍵用鍊錶串起...

Java HashMap原始碼分析

在平時需要用到鍵值對儲存資料時,我們便會用到hashmap,這篇文章基於jdk1.8,參考前輩的文章,對hashmap進行一定的理解.面試必備 hashmap原始碼解析 jdk8 hashmap之比於arraylist和linkedlist,感覺原始碼複雜得多,由於才學疏淺,本文很大部分參考上面鏈結...

java hashmap原始碼學習二 put get

hashmap裡面兩個最重要的方法就是get和put 一 put object key 方法的實現 public v put k key,v value putval 的基本思路 1.要是table為空,則建立新的table 2.要是table length 1 hash key 為空,則建立新節點...