HashMap与Hashtable

前面分析了HashMap的源码,我们再来看看Hashtable,两者有些什么区别呢?

1、HashMap与Hashtable都是基于哈希算法来确定元素位置,元素的存放也是数组加链表的形式,不同的是,Hashtable是存链表,没有红黑树的参与;

2、Hashtable中数组的实际长度并不一定是2的幂,Hashtable的默认容量是11,扩容时,容量扩容为原容量的两倍加1,因为Hashtable中数组长度要尽量为素数或奇数;

3、Hashtable的计算下标方式不同,直接用key的哈希值与int的最大值做与运算,然后对容量取模,得到最终存放的下标;

4、Hashtable中的所有public方法都加上了synchronized关键字,所以Hashtable是线程安全的,但也正因为安全,Hashtable的效率低下;

5、Hashtable在放入数据时,在数组下标的链表上采取的是头插法,从链表的头部开始插入,这种方法要比HashMap的尾部插入效率高(HashMap在1.7中也是采取的头插法,但由于线程不安全,容易造成死循环,所以1.8中改成了尾部追加,Hashtable是线程安全的,不会出现死循环);

5、Hashtable的key和value都不允许出现null值,否则会抛空指针异常;

6、HashMap的扩容条件是数据长度达到阈值或者数组中某一个链表的长度达到设定的值,而Hashtable中只有数据长度达到阈值时才会扩容。

你可能感兴趣的:(java)