HashMap与HashTable

HashMap简介

hashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,内容不足时会自动增长。
hashMap是非线程安全的,只适用于单线程环境,多线程可以采用concurrent包下的concurrentHashMap。
hashMap实现了serializable接口,支持序列化。实现了Cloneable接口,支持clone。
hashMap的键值对可以为null,key为null的键值对永远都放在以table[0]为头的节点的链表中。

HashTable简介

Hashtable同样是基于哈希表实现的,同样每个元素是一个key-value对,其内部也是通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长。
Hashtable也是JDK1.0引入的类,是线程安全的,能用于多线程环境中。
Hashtable同样实现了Serializable接口,它支持序列化,实现了Cloneable接口,能被克隆。

HashTable和HashMap区别

1、继承类不同
  hashTable继承Dictionary类,hashMap继承AbstractMap类。两者都实现了map接口
2、线程安全不同
  hashTable安全,hashMap不安全
3、key和value是否允许null值
  hashTable中,key和value都不允许出现null值
  hansMap中,key和value可以为null
4、两个遍历方式的内部实现上不同
  hashtable、hashMap都使用了 Iterator。而由于历史原因,Hashtable还使用了Enumeration的方式 。
5、hash值不同
  哈希值的使用不同,HashTable直接使用对象的hashCode。而HashMap重新计算hash值。
6、内部实现使用的数组初始化和扩容方式不同
  HashTable在不指定容量的情况下的默认容量为11,而HashMap为16,Hashtable不要求底层数组的容量一定要为2的整数次幂,而HashMap则要求一定为2的整数次幂。
  Hashtable扩容时,将容量变为原来的2倍加1,而HashMap扩容时,将容量变为原来的2倍。
  Hashtable和HashMap它们两个内部实现方式的数组的初始大小和扩容的方式。HashTable中hash数组默认大小是11,增加的方式是 old*2+1
7、是否提供contains方法
  HashMap把Hashtable的contains方法去掉了,改成containsValue和containsKey,因为contains方法容易让人引起误解。
  Hashtable则保留了contains,containsValue和containsKey三个方法,其中contains和containsValue功能相同。

参考内容

https://www.cnblogs.com/williamjie/p/9099141.html
https://blog.csdn.net/qq_34602647/article/details/81671067
http://mini.eastday.com/mobile/180310183019559.html

你可能感兴趣的:(HashMap与HashTable)