HashMap和Hashtable的区别

Hoshi ·
更新时间:2024-11-13
· 813 次阅读

Hashtable和HashMap的区别: Hashmap是开发中用的比较多的一种集合,是线程不安全的,Hashtable的方法上大多都加了synchronized所以是线程安全的,所以效率并不高。这也是它们最大的不同。

     2.Hashtable继承的类和实现的接口:(Dictionary类已经被废弃了)

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

     HashMap继承的类和实现的接口:

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

 由此可见它们继承的类不相同,只不过都实现了 Map,Cloneable,Serializable 接口

   3.对外提供的接口不同

   Hashtable比HashMap多提供了elments() 和contains() 两个方法。

    elments() 方法继承自Hashtable的父类Dictionnary。elements() 方法用于返回此Hashtable中的value的枚举。

    contains()方法判断该Hashtable是否包含传入的value。它的作用与containsValue()一致。事实上,contansValue() 就只是调用了一下contains() 方法。

public boolean containsValue(Object value) { return contains(value); }

  4.  Hashtable不允许Key为null,也不允许Value为null。而HashMap允许Key为null

     HashMap当有多个Key为null时,会将Value覆盖。可以有一个或多个Key所对应的值为null。当get()方法返回null值时,可能是 HashMap    中没有该键,也可能使该键所对应的值为null。因此,在HashMap中不能由get()方法来判断HashMap中是否存在某个键, 而  应      该用containsKey()方法来判断。

 5.   初始容量大小和每次扩充容量大小的不同
Hashtable默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。

创建时,如果给定了容量初始值,那么Hashtable会直接使用你给定的大小,而HashMap会将其扩充为2的幂次方大小。也就是说Hashtable会尽量使用素数、奇数。而HashMap则总是使用2的幂作为哈希表的大小。

6.计算hash的方式不同

   HashMap中有个hash方法,通过hash.hashCode方法计算出一个值,通过右移16位与之相异或,从而得到新的hash值。

static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }

  Hashtable通过计算key的hashCode()来得到hash值就为最终hash值。

7.解决hash地址冲突的方式不同

Java8,HashMap中,当出现冲突时可以:

1.如果冲突数量小于8,则是以链表方式解决冲突。 2.而当冲突大于等于8时,就会将冲突的Entry转换为**红黑树进行存储。** 3.而又当数量小于6时,则又转化为链表存储。

而Hashtable一直以链表形式存储

参考文章:https://blog.csdn.net/wangxing233/article/details/79452946


作者:赵不懂zzz



hashmap

需要 登录 后方可回复, 如果你还没有账号请 注册新账号