Java集合6——HashMap和HashTable的区别

HashMap与HashTable的不同

HashTable简介

和HashMap一样,Hashtable 也是一个散列表,它存储的内容是键值对(key-value)映射
Hashtable 继承于Dictionary,实现了Map、Cloneable、java.io.Serializable接口。
Hashtable 的函数都是同步的,这意味着它是线程安全的。它的key、value都不可以为null。此外,Hashtable中的映射不是有序的。

  1. 首先来观察这两个类的定义

  HashTable

   public class Hashtable<K,V>  

    extends Dictionary<K,V>  

    implements Map<K,V>, Cloneable, java.io.Serializable {  

  HashMap

   public class HashMap<K,V>  

    extends AbstractMap<K,V>  

    implements Map<K,V>, Cloneable, Serializable    

HashTable继承于Dictionary<K,V>,而HashMap继承于AbstractMap<K,V>

  1. 观察其put方法

HashMap

Java集合6——HashMap和HashTable的区别

 

这是HashMap的put()方法,这里允许key为null。如果key值重复将覆盖其value值,并且先对key值进行两次Hash

Java集合6——HashMap和HashTable的区别

Java集合6——HashMap和HashTable的区别

如果超过默认容量,将用这种方法扩容。2*table.length

 

HashTable

Java集合6——HashMap和HashTable的区别

*** 线程安全的

*** key值和value值不能为null,会报异常

*** 直接调用了Hashcode()方法

 

Java集合6——HashMap和HashTable的区别

如果超过默认容量将调用rehash()方法,

Java集合6——HashMap和HashTable的区别

扩容为二倍加一

  1. 观察其默认值

HashTable

Java集合6——HashMap和HashTable的区别

 

可知HashTable的默认大小为11

HashMap

Java集合6——HashMap和HashTable的区别

可知HashMap的默认容量为16