HashMap底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表,JDK1.8中還引入了紅黑樹(shù),當(dāng)鏈表長(zhǎng)度超過(guò)8個(gè)時(shí),會(huì)將鏈表轉(zhuǎn)成紅黑樹(shù),以提升其查找性能。
創(chuàng)新互聯(lián)建站是一家專(zhuān)業(yè)提供騰沖企業(yè)網(wǎng)站建設(shè),專(zhuān)注與成都網(wǎng)站制作、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務(wù)。10年已為騰沖眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專(zhuān)業(yè)網(wǎng)絡(luò)公司優(yōu)惠進(jìn)行中。那么,給出一個(gè)<key, value>節(jié)點(diǎn),HashMap是如何確定這個(gè)節(jié)點(diǎn)應(yīng)該放在具體哪個(gè)位置呢?(以JDK1.8為例)
final V putVal(int hash, K key, V value, boolean onlyIfAbsent, boolean evict) { Node<K,V>[] tab; Node<K,V> p; int n, i; // HashMap沒(méi)有被初始化,則先進(jìn)行初始化 if ((tab = table) == null || (n = tab.length) == 0) n = (tab = resize()).length; // 節(jié)點(diǎn)所在index = (n - 1) & hash,該位置沒(méi)有數(shù)據(jù),則直接將新節(jié)點(diǎn)放在數(shù)組的index位置上 if ((p = tab[i = (n - 1) & hash]) == null) tab[i] = newNode(hash, key, value, null); else { // index上已經(jīng)有節(jié)點(diǎn)了 Node<K,V> e; K k; // 如果新key與原來(lái)的key一樣,則e指向原節(jié)點(diǎn)p(后面會(huì)用新value替換e所指向的value) if (p.hash == hash && ((k = p.key) == key || (key != null && key.equals(k)))) e = p; // 如果該節(jié)點(diǎn)是樹(shù)節(jié)點(diǎn),則采用樹(shù)的插入算法,插入新節(jié)點(diǎn) else if (p instanceof HashMap.TreeNode) e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value); else { // 該節(jié)點(diǎn)是鏈表節(jié)點(diǎn) for (int binCount = 0; ; ++binCount) { // 將新節(jié)點(diǎn)插入到index所在鏈表的末端 if ((e = p.next) == null) { p.next = newNode(hash, key, value, null); // 鏈表節(jié)點(diǎn)超過(guò)8個(gè),則進(jìn)行鏈表轉(zhuǎn)樹(shù)處理 if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st treeifyBin(tab, hash); break; } // 同樣的,如果key已經(jīng)存在的話(huà),則不進(jìn)行插入操作,而是后面進(jìn)行value替換 if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) break; p = e; } } // e != null的情況,就是key已經(jīng)存在了,這里統(tǒng)一進(jìn)行了新值value,替換舊值e.value的操作 if (e != null) { // existing mapping for key V oldValue = e.value; if (!onlyIfAbsent || oldValue == null) e.value = value; afterNodeAccess(e); return oldValue; } } ++modCount; // 插入后數(shù)組size 大于閾值的話(huà),需要進(jìn)行擴(kuò)容 if (++size > threshold) resize(); afterNodeInsertion(evict); return null; }
網(wǎng)站標(biāo)題:HashMap容量和負(fù)載因子使用說(shuō)明-創(chuàng)新互聯(lián)
網(wǎng)頁(yè)路徑:http://jinyejixie.com/article2/ccepoc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計(jì)、動(dòng)態(tài)網(wǎng)站、小程序開(kāi)發(fā)、定制網(wǎng)站、電子商務(wù)、微信公眾號(hào)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容