日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HashMap的put方法讲解

發(fā)布時間:2024/2/28 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HashMap的put方法讲解 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
public V put(K key, V value) {// 調(diào)用hash(key)計算出key的hash值return putVal(hash(key), key, value, false, true); }static final int hash(Object key) {int h;// 如果key為null,則hash值為0,否則調(diào)用key的hashCode()方法// 并讓高16位與整個hash異或,這樣做是為了使計算出的hash更分散return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }final V putVal(int hash, K key, V value, boolean onlyIfAbsent,boolean evict) {Node<K, V>[] tab;Node<K, V> p;int n, i;// 如果桶的數(shù)量為0,則初始化if ((tab = table) == null || (n = tab.length) == 0)// 調(diào)用resize()初始化n = (tab = resize()).length;// (n - 1) & hash 計算元素在哪個桶中// 如果這個桶中還沒有元素,則把這個元素放在桶中的第一個位置if ((p = tab[i = (n - 1) & hash]) == null)// 新建一個節(jié)點放在桶中tab[i] = newNode(hash, key, value, null);else {// 如果桶中已經(jīng)有元素存在了Node<K, V> e;K k;// 如果桶中第一個元素的key與待插入元素的key相同,保存到e中用于后續(xù)修改value值if (p.hash == hash &&((k = p.key) == key || (key != null && key.equals(k))))e = p;else if (p instanceof TreeNode)// 如果第一個元素是樹節(jié)點,則調(diào)用樹節(jié)點的putTreeVal插入元素e = ((TreeNode<K, V>) p).putTreeVal(this, tab, hash, key, value);else {// 遍歷這個桶對應(yīng)的鏈表,binCount用于存儲鏈表中元素的個數(shù)for (int binCount = 0; ; ++binCount) {// 如果鏈表遍歷完了都沒有找到相同key的元素,說明該key對應(yīng)的元素不存在,則在鏈表最后插入一個新節(jié)點if ((e = p.next) == null) {p.next = newNode(hash, key, value, null);// 如果插入新節(jié)點后鏈表長度大于8,則判斷是否需要樹化,因為第一個元素沒有加到binCount中,所以這里-1if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1sttreeifyBin(tab, hash);break;}// 如果待插入的key在鏈表中找到了,則退出循環(huán)if (e.hash == hash &&((k = e.key) == key || (key != null && key.equals(k))))break;p = e;}}// 如果找到了對應(yīng)key的元素if (e != null) { // existing mapping for key// 記錄下舊值V oldValue = e.value;// 判斷是否需要替換舊值if (!onlyIfAbsent || oldValue == null)// 替換舊值為新值e.value = value;// 在節(jié)點被訪問后做點什么事,在LinkedHashMap中用到afterNodeAccess(e);// 返回舊值return oldValue;}}// 到這里了說明沒有找到元素// 修改次數(shù)加1++modCount;// 元素數(shù)量加1,判斷是否需要擴容if (++size > threshold)// 擴容resize();// 在節(jié)點插入后做點什么事,在LinkedHashMap中用到afterNodeInsertion(evict);// 沒找到元素返回nullreturn null; }

(1)計算key的hash值;

(2)如果桶(數(shù)組)數(shù)量為0,則初始化桶;

(3)如果key所在的桶沒有元素,則直接插入;

(4)如果key所在的桶中的第一個元素的key與待插入的key相同,說明找到了元素,轉(zhuǎn)后續(xù)流程(9)處理;

(5)如果第一個元素是樹節(jié)點,則調(diào)用樹節(jié)點的putTreeVal()尋找元素或插入樹節(jié)點;

(6)如果不是以上三種情況,則遍歷桶對應(yīng)的鏈表查找key是否存在于鏈表中;

(7)如果找到了對應(yīng)key的元素,則轉(zhuǎn)后續(xù)流程(9)處理;

(8)如果沒找到對應(yīng)key的元素,則在鏈表最后插入一個新節(jié)點并判斷是否需要樹化;

(9)如果找到了對應(yīng)key的元素,則判斷是否需要替換舊值,并直接返回舊值;

(10)如果插入了元素,則數(shù)量加1并判斷是否需要擴容;

總結(jié)

以上是生活随笔為你收集整理的HashMap的put方法讲解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。