HashMap和HashTable的区别

参考文章:

https://blog.csdn.net/xuhuaabc/article/details/91475761

 首先看一下这两个类的定义 

public class HashMap extends AbstractMap implements Map, Cloneable, Serializable {}

public class Hashtable extends Dictionary implements Map, Cloneable, java.io.Serializable {}

相同点:

1.都是HashMap是基于哈希表实现的,每一个元素是一个key-value对,其内部通过单链表解决冲突问题,容量不足(超过了阀值)时,同样会自动增长(阀值=容量大小*加载因子,默认容量大小=16,加载因子=0.75,因此默认阀值=12,当HashMap中容量超过12时,会自动给HashMap扩容)。

2.都实现了Serializable和Cloneable接口,因此都支持序列化和克隆。

不同点:

1.实现不同:这两个类都是实现Map接口,不同的是HashMap继承了AbstractMap类,HashTable继承了Dictionary类。

2.线程安全不同:HashMap非线程安全的,适用于单线程环境,在多线程环境下使用concurrentHashMap。HashTable是线程安全的。

3.是否允许null:HashMap中key和value都允许为null。key为null的键值对永远都放在以table[0]为头结点的链表中。HashTable键值对都不能为空,否则报空指针异常。

3.hash值的计算方式不同:HashMap是先调用hashCode方法计算出来一个hash值,再将hash与右移16位后相异或,从而得到新的hash值Hashtable通过计算key的hashCode()**来得到hash值就为最终hash值。

4.扩容方式不同:HashMap 哈希扩容必须要求为原容量的2倍,而且一定是2的幂次倍扩容结果,而且每次扩容时,原来数组中的元素依次重新计算存放位置,并重新插入;
而Hashtable扩容为原容量2倍加1;

5.解决冲突不同:在HashMap中,

        1.如果冲突数量小于8,则是以链表方式解决冲突。

        2.而当冲突大于等于8时,就会将冲突的Entry转换为**红黑树进行存储。

        3.而又当数量小于6时,则又转化为链表存储。

在HashTable中,都是以链表方式存储。

你可能感兴趣的:(Java基础)