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的底层实现都是数组+链表结构实现
相关文章
相关标签/搜索