HashMap:存储无序,键唯一,通过重写hashcode和equals方法保证唯一性,键值可存储为null,有containsValue和containsKey方法,线程不同步,效率上比HashTable要高,适合单线程环境,底层由数组和链表构成(JDK8后容量达到8链表会转换成红黑树),初始容量为16,负载因子为0.75,当容量达到当前容量*0.75时,扩容每次为2的指数,容量设置为16和扩容因子为2是为了减少哈希碰撞,HashMap 的迭代器(Iterator)是 fail-fast 迭代器。
HashTable:继承的是Dictionary,存储无序,键唯一,HashTable不允许存储null键值,线程是同步的,适合多线程环境,HashTable 中数组默认大小是 11 ,扩容方法是 old * 2 + 1,HashTable的 enumerator 迭代器不是 fail-fast 的。
总结:一般现在不建议用 HashTable。
主要原因是两点:
一是,HashTable 是遗留类,内部实现很多没优化和冗余。
二是,即使在多线程环境下,现在也有同步的 ConcurrentHashMap 替代,没有必
要因为是多线程而用Hashtable
网友评论