中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

HashMap容量和負載因子使用說明-創(chuàng)新互聯(lián)

HashMap底層數(shù)據(jù)結(jié)構(gòu)是數(shù)組+鏈表,JDK1.8中還引入了紅黑樹,當鏈表長度超過8個時,會將鏈表轉(zhuǎn)成紅黑樹,以提升其查找性能。

創(chuàng)新互聯(lián)建站是一家專業(yè)提供騰沖企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站制作、成都做網(wǎng)站、H5建站、小程序制作等業(yè)務。10年已為騰沖眾多企業(yè)、政府機構(gòu)等服務。創(chuàng)新互聯(lián)專業(yè)網(wǎng)絡公司優(yōu)惠進行中。

那么,給出一個<key, value>節(jié)點,HashMap是如何確定這個節(jié)點應該放在具體哪個位置呢?(以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沒有被初始化,則先進行初始化
  if ((tab = table) == null || (n = tab.length) == 0)
    n = (tab = resize()).length;
  // 節(jié)點所在index = (n - 1) & hash,該位置沒有數(shù)據(jù),則直接將新節(jié)點放在數(shù)組的index位置上
  if ((p = tab[i = (n - 1) & hash]) == null)
    tab[i] = newNode(hash, key, value, null);
  else { // index上已經(jīng)有節(jié)點了
    Node<K,V> e; K k;
    // 如果新key與原來的key一樣,則e指向原節(jié)點p(后面會用新value替換e所指向的value)
    if (p.hash == hash &&
      ((k = p.key) == key || (key != null && key.equals(k)))) 
      e = p;
    // 如果該節(jié)點是樹節(jié)點,則采用樹的插入算法,插入新節(jié)點
    else if (p instanceof HashMap.TreeNode)
      e = ((TreeNode<K,V>)p).putTreeVal(this, tab, hash, key, value);
    else { // 該節(jié)點是鏈表節(jié)點
      for (int binCount = 0; ; ++binCount) {
        // 將新節(jié)點插入到index所在鏈表的末端
        if ((e = p.next) == null) {
          p.next = newNode(hash, key, value, null);
          // 鏈表節(jié)點超過8個,則進行鏈表轉(zhuǎn)樹處理
          if (binCount >= TREEIFY_THRESHOLD - 1) // -1 for 1st
            treeifyBin(tab, hash);
          break;
        }
        // 同樣的,如果key已經(jīng)存在的話,則不進行插入操作,而是后面進行value替換
        if (e.hash == hash &&
          ((k = e.key) == key || (key != null && key.equals(k))))
          break;
        p = e;
      }
    }
    // e != null的情況,就是key已經(jīng)存在了,這里統(tǒng)一進行了新值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 大于閾值的話,需要進行擴容
  if (++size > threshold)
    resize();
  afterNodeInsertion(evict);
  return null;
}

網(wǎng)站標題:HashMap容量和負載因子使用說明-創(chuàng)新互聯(lián)
網(wǎng)頁路徑:http://www.rwnh.cn/article2/ccepoc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供App設(shè)計動態(tài)網(wǎng)站、小程序開發(fā)、定制網(wǎng)站電子商務、微信公眾號

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
孙吴县| 霍山县| 皮山县| 海城市| 祁连县| 芜湖市| 华阴市| 尼勒克县| 北海市| 旺苍县| 历史| 噶尔县| 淮安市| 和平区| 永吉县| 察雅县| 金门县| 红桥区| 延吉市| 秭归县| 万安县| 安顺市| 哈巴河县| 奇台县| 五寨县| 遵义市| 建瓯市| 汕头市| 萍乡市| 乌兰察布市| 德州市| 玛曲县| 监利县| 龙胜| 雷波县| 清新县| 赤峰市| 桦川县| 龙门县| 南丰县| 花垣县|