HashMap和HashTable的区别

131 阅读2分钟

这是我参与8月更文挑战的第14天,活动详情查看: 8月更文挑战

集合是我们在日常开发中常用到的,但是在什么时候具体使用哪个集合类,就是要较熟练的了解其中的区别了,再深入一些,那就是其的底层实现的实现之类的。

今天我们就来学习一个HashMap和HashTable的区别。

父类

两者实现的接口一致,都是实现了Map接口,继承的父类不同。

HashMap继承自AbstractMap类。

HashTable继承自Dictionary类,Dictionary类目前已经被废弃的类。

线程是否安全

HashMap线程不安全,HashTable线程安全,因此在多线程场景下,就不能使用HashMap了,不然就会出现哈希冲突问题啦,也是HashMap的底层结构导致的这种问题。

包含的contains方法不同

对于contains方法,其实HashMap是没有contains方法的,但是HashMap包括containsValue和containsKey方法;

HashTable则保留了contains方法,效果和containsValue相同,HashTable也存在containsValue和containsKey方法。

是否允许null值

HashMap是允许key和value为null值,具体实现时通过containsValue和containsKey方法来判断是否存在对应的键值对。

而HashTable是不允许存在null值的。

计算hash值方式不同

扩容方式不同

当容量不足时要进行扩容时,这时候会调用内部方法resize()方法,其中会进行对应的扩容。

HashMap规定扩容时要扩容成当前容量总和的两倍,包括刚生成的对象也是会按照2的幂次倍进行初始扩容。

HashTable略有不同,它的扩容机制是乘以2,然后加1。

解决Hash冲突的方式不同

HashMap的处理方式在JDK7和JDK8版本中存在不同的情况,之后我们详细学习。

HashTable中的哈希冲突,均是以链表方式存储。

注意:HashTable在JDK中已经不推荐使用了,如果想用线程安全的HashMap,那就用CocurrentHashMap吧。