HashMap 1.7 和 1.8

http://www.javashuo.com/article/p-ajjikygn-o.htmlhtml

  • 1.7 爲何擴容須要從新計算hash,1.8不須要?
    • 1.7 的rehash計算
      • int i = indexFor(e.hash, newCapacity);
      • static int indexFor(int h, int length) {  //jdk1.7的源碼,jdk1.8沒有這個方法,可是實現原理同樣的
              return h & (length-1);  //第三步 取模運算
         }
      • hash值與新容量作&操做
    • 1.8 取巧:
      • 因爲每次擴容都是原來的2倍,換算成二進制就是多一位,
      • 那麼只須要進行該位的& 運算,0位置不變,1位置變爲原來位置+擴容前容量
  • 1.7出現死循環緣由:
    • https://www.cnblogs.com/warehouse/p/9419078.html
      • 存的是Node節點,插入須要改變鏈表的先後順序
        • 好比原本是1->2->3
        • 擴容後獲得 3->2->1
        • 線程A插入節點一、2後,獲得2->1
        • B線程開始插入,把1插到2的前面
          • 1 2之間死循環
    • 1.8不會致使死循環可是會致使,數據被覆蓋(丟數據)
      • 一個線程A得到插入點位置的時候,
        • 另外一個線程B在該位置插入了本身的值
        • A線程不知道本身插入點過時,直接插入值,覆蓋B線程剛剛插入的值
  • HashMap的鍵key 可爲null(區別於 HashTablekey 不可爲null
    • 存儲在table[0]的位置
  • http://www.javashuo.com/article/p-ajjikygn-o.html
  • http://www.javashuo.com/article/p-eiwmdbul-cu.html
相關文章
相關標籤/搜索