HashMap,ConcurrentHashMap1.7和1.8的区别
时间: 2023-11-08 17:59:41 浏览: 118
HashMap和ConcurrentHashMap在JDK 1.7和JDK 1.8中有一些区别。在JDK 1.7中,HashMap的数据结构是由一个Entry数组和多个Entry链表组成,每个Entry中包含键值对的信息。而ConcurrentHashMap在JDK 1.7中的数据结构是由一个Segment数组和多个HashEntry组成,每个Segment内部是一个类似于HashMap的结构。每个Segment内部的扩容逻辑和HashMap中一样。
在JDK 1.8中,HashMap的数据结构进行了优化,引入了红黑树来替代链表,以提高搜索性能。当链表长度超过阈值时,链表会转换为红黑树。而ConcurrentHashMap在JDK 1.8中的数据结构也进行了优化,底层数据结构由Segment数组变为了Node数组,使用了CAS(Compare and Swap)操作来实现线程安全。
另外,ConcurrentHashMap在进行get操作时,需要先进行一次hash定位到Segment的位置,然后再进行hash定位到具体的HashEntry,然后在该HashEntry下的链表中进行比对。而HashMap则直接通过计算hash值就可以找到对应的Entry。
相关问题
concurrenthashmap1.7和1.8的区别
Java 并发包中的 ConcurrentHashMap 类在1.7和1.8版本中的最明显的区别是实现方式。在1.7版本中,ConcurrentHashMap 通过将整个 Map 分成一个个 Segment,每个 Segment 都是一个类似 HashMap 的结构,这样在不同 Segment 上的操作可以并发进行,从而提高了并发性能。而在1.8版本中,ConcurrentHashMap 废除了 Segment 的结构,而是采用了一种全新的方式来实现。使用了 CAS (compare and swap) 操作,将已经计算好的 hash 值和 table 索引进行了分离,使得插入操作只需要锁住相应位置而不是整个表,提高了并发性能。此外,1.8版本还增加了很多新的 API 以提供更好的功能和更高的并发性能。
concurrenthashmap 1.7和1.8的区别
ConcurrentHashMap 在 Java 1.7 和 Java 1.8 中都有所改进,但是改进的方向和重点略有不同。
1.7 版本中的改进:
1.1 分段锁的粒度更细:在 1.7 版本中,ConcurrentHashMap 中的 Segment 数量由原先的固定值 16 调整为可根据实际需要动态调整。
1.2 存储结构优化:在 1.7 版本中,ConcurrentHashMap 中的链表长度超过一定阈值时,会将链表转化为红黑树,以提高查找效率。
1.3 改进了迭代器:在 1.7 版本中,ConcurrentHashMap 的迭代器支持弱一致性,可以在迭代过程中反映出 Map 中的最新数据,但是不保证迭代结果的完全正确性。
1.8 版本中的改进:
1.1 数组扩容优化:在 1.8 版本中,ConcurrentHashMap 中的数组扩容时采用了 CAS 操作和 Unsafe 类的相关方法来实现,从而避免了多个线程同时扩容导致的性能下降。
1.2 实现了基于 CAS 的更新操作:在 1.8 版本中,ConcurrentHashMap 的 putIfAbsent、remove、replace 等操作不再使用锁,而是使用基于 CAS 的操作来实现。
1.3 改进了计算 hash 值的方法:在 1.8 版本中,ConcurrentHashMap 中计算 hash 值的方法进行了优化,使用了类似于 HashMap 的方式来实现,提高了并发效率。
总之,ConcurrentHashMap 在不同版本中的改进主要涉及到分段锁、存储结构、迭代器、数组扩容、CAS 操作等方面。1.8 版本相比于 1.7 版本,更加注重利用 CAS 操作来提高并发效率,同时也对其他细节进行了优化。
阅读全文