首页 > 编程知识 正文

hashmap和map的区别,HashMap的底层实现原理

时间:2023-05-06 00:55:41 阅读:51091 作者:4922

3358www.Sina.com/是首次发布java时提供的键值映射的数据结构, Hashtable是在JDK1.2中生成的。 Hashtable在HashMap之前不久问世,但目前HashMap几乎已被舍弃。Hashtable已成为应用最广泛的数据类型。 一个这样的原因是HashMap是线程安全的,效率不高。Hashtable开始设计时可能没有遵循驼峰命名法。

1、父母种类不同:

HashMap从AbstractMap类继承,HashTable从Dictionary继承。 但是,都同时实现了map、Cloneable、Serializable这三个接口。

与HashMap相比,Hashtable提供了两种方法: elments ()和contains () )。

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

contains ) )方法确定是否包含传递给Hashtable的value。 其角色与containsValue () )匹配。 实际上,contansValue ()只是调用了contains ) )方法。

2、空值问题

Hashtable既不支持空密钥,也不支持空值。 Hashtable的put ()方法的注释中有说明。

在HashMap中,null可以用作键。 只有一个这样的键。与一个或多个键相对应的值为空。 如果get ()方法返回null值,则HashMap可能没有键,或者与键对应的值为null。 因此,在HashMap中,应该用containsKey ) )方法来确定一个键是否在HashMap中,而不是用get ()方法来确定。

3、线程安全

Hashtable是线程安全的,每个方法都添加了Synchronize方法。 在多线程并发环境中,可以直接使用Hashtable,因此无需自己同步该方法

HashMap不是线程安全的,在多线程并发的环境中可能会出现死锁等问题。 具体原因将在下面的文章中详细分析。 要使用HashMap,必须自己添加同步过程。

HashMap虽然不是线程安全的,但比Hashtable高效得多。 这样设计是合理的。 在我们的日常使用中,大部分时间都是单线程操作的。 HashMap释放了这一部分操作。 如果需要多线程操作,可以使用线程安全的ConcurrentHashMap。 ConcurrentHashMap也是线程安全的,但比Hashtable效率高很多倍。 ConcurrentHashMap使用分段锁定,因此不会锁定整个数据。

tip:HashMap位于JDk1.2之后,而在JDK1.5中,伟大的Doug Lea为我们带来了一个并发包。 从那以后,地图上也有安全的东西。 也就是说,ConcurrentHashMap (对此的理解有机会再写或者自行百度) ) ) ) )。

4、遍历方式不同

Hashtable、HashMap都使用了迭代器。 出于历史原因,Hashtable还使用枚举方法。

HashMap的迭代器是故障快速迭代器。 如果其他线程更改了HashMap的结构(添加、删除和修改元素),则会抛出concurrentmodificationexception。 但是,使用iterator remove ()方法删除元素不会引发concurrentmodificationexception异常。 但是,这不是一定会发生的行为,必须看JVM。

在JDK8之前的版本中,Hashtable没有快速故障机制。 从JDK8开始,Hashtable也使用快速故障。 (现在我们来比较一下1.5和1.8的JDK源代码。)

5、初始容量不同

Hashtable的初始长度为11,然后每个扩展容量为前面的2n1(n为上次长度)

HashMap的初始长度为16,之后每次都是2倍

如果在创建时指定了容量的初始值,Hashtable将保留指定的大小,HashMap将扩展为2的幂大小。

6、计算哈希值的方法不同

为了得到元素的位置,首先需要根据元素的KEY计算散列值,并使用该散列值计算最终的位置

Hashtable直接使用对象的hashCode。 hashCode是JDK根据对象的地址、字符串或数字计算出的int型数值。 然后用余留来获得最终的职位。 但是除法非常费时间。 效率低

为了提高计算效率,HashMap将哈希表大小固定为2的幂。 由此,在取得模型的预算时,不需要进行除法运算,只需要进行位运算。 位运算比除法运算效率高得多。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。