1. 程式人生 > >HashMap和Hashtable 區別

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的底層實現都是陣列+連結串列結構實現