浅析HashMap与HashTable的区别
HashMap 和 HashTable 都是基于哈希表实现的,其内部每个元素都是 key-value 键值对,HashMap 和 HashTable 都实现了 Map、Cloneable、Serializable 接口。
父类不同
HashMap 继承了 AbstractMap 类,而 HashTable 继承了 Dictionary 类
空键值
HashMap允许空键值的存在,而HashTable不允许空键值的存在,如果key或者value是null,则会抛出空指针异常。
线程安全性不同
HashMap 不是线程安全的,如果多个外部操作同时修改 HashMap 的数据结构比如 add 或者是 delete,必须进行同步操作,仅仅对 key 或者 value 的修改不是改变数据结构的操作。可以选择构造线程安全的 Map 比如 Collections.synchronizedMap 或者是 ConcurrentHashMap。而 HashTable 本身就是线程安全的容器,由于HashTable的put和get操作都加了synchronized,在多线程并发时效率会低一些。
扩容机制不同
HashMap 扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
而Hashtable扩容为原容量2倍加1。