HashMap和Hashtable 區別

  • Hashtable是線程安全,而HashMap則非線程安全
    • Hashtable的實現方法裏面都添加了synchronized關鍵字來確保線程同步
  • HashMap可使用null做爲key,而Hashtable則不容許null做爲key
  • HashMap是對Map接口的實現,HashTable實現了Map接口Dictionary抽象類
  • HashMap的初始容量爲16,Hashtable初始容量爲11,二者的填充因子默認都是0.75
    • HashMap擴容時是當前容量翻倍即:capacity*2,
    • Hashtable擴容時是容量翻倍+1即:capacity*2+1
  • 二者計算hash的方法不一樣
    • Hashtable計算hash是直接使用key的hashcode對table數組的長度直接進行取模
      • int hash = key.hashCode();
        int index = (hash & 0x7FFFFFFF) % tab.length;
    • HashMap計算hash對key的hashcode進行了二次hash,以得到更好的散列值,而後對table數組長度取摸
      • static int hash(int h) {
                // This function ensures that hashCodes that differ only by
                // constant multiples at each bit position have a bounded
                // number of collisions (approximately 8 at default load factor).
                h ^= (h >>> 20) ^ (h >>> 12);
                return h ^ (h >>> 7) ^ (h >>> 4);
            }
        
         static int indexFor(int h, int length) {
                return h & (length-1);
            }
    • HashMap和Hashtable的底層實現都是數組+鏈表結構實現
相關文章
相關標籤/搜索