集合是我们在日常开发中常用到的,但是在什么时候具体使用哪个集合类,就是要较熟练的了解其中的区别了,再深入一些,那就是其的底层实现的实现之类的。
今天我们就来学习一个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吧。