Add article comparing HashMap and ConcurrentHashMap

This commit is contained in:
2025-08-11 11:10:29 +00:00
parent 0f47c052f2
commit d90b2729cb
5 changed files with 35 additions and 0 deletions

0
public/api/i/2025/08/09/124cfwm-1.webp Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 27 KiB

After

Width:  |  Height:  |  Size: 27 KiB

0
public/api/i/2025/08/09/124ikdt-1.webp Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 18 KiB

0
public/api/i/2025/08/09/12542r3-1.webp Normal file → Executable file
View File

Before

Width:  |  Height:  |  Size: 16 KiB

After

Width:  |  Height:  |  Size: 16 KiB

View File

@@ -23,3 +23,13 @@ LinkedList由于要存储前后节点的引用每个元素的内存开销更
在实际项目中如果需要频繁随机访问元素会选择ArrayList如果需要频繁在两端添加删除元素比如实现队列和栈我会选择LinkedList
ArrayList和LinkedList都是Java中常见的集合类它们都实现了List接口。
底层数据结构不同ArrayList使用数组实现通过索引进行快速访问元素。
LinkedList使用链表实现通过节点之间的指针进行元素的访问和操作。
插入和删除操作的效率不同ArrayList在尾部的插入和删除操作效率较高但在中间或开头的插入和删除操作效率较低需要移动元素。
LinkedList在任意位置的插入和删除操作效率都比较高因为只需要调整节点之间的指针。随机访问的效率不同ArrayList支持通过索引进行快速随机访问时间复杂度为O(1)。
LinkedList需要从头或尾开始遍历链表时间复杂度为O(n)。
空间占用ArrayList在创建时需要分配一段连续的内存空间因此会占用较大的空间。LinkedList每个节点只需要存储元素和指针因此相对较小。
使用场景ArrayList适用于频繁随机访问和尾部的插入删除操作而LinkedList适用于频繁的中间插入删除操作和不需要随机访问的场景。
线程安全这两个集合都不是线程安全的Vector是线程安全的

View File

@@ -0,0 +1,25 @@
---
title: HashMap和ConcurrentHashMap的区别
published: 2025-08-11
description: ''
image: ''
tags: [ConcurrentHashMap,Java]
category: 'Java > 集合框架'
draft: false
lang: ''
---
# JDK1.7版本
- 内存结构: HashMap采用数组+链表的结构数组是HashMap的主体链表用于解决哈希冲突。当两个不同的键通过哈希函数计算得到相同的索引时它们会被存储在同一个数组位置的链表中。ConcurrentHashMap在JDK1.7中采用了分段锁的机制内部是一个Segment数组每个Segment类似一个小的HashMap有自己的数组和链表。
- 线程安全性: HashMap不是线程安全的在多线程环境下如果多个线程同时对HashMap进行读写操作可能会导致数据不一致死循环的问题。ConcurrentHashMap是线程安全的它通过分段锁的机制来保证并发访问时的线程安全。只有当多个线程访问同一个Segment时才会发生锁竞争从而提高了并发性能。
- 性能: hashmap由于没有锁的开销所以在单线程环境下性能较好但是在多线程环境下为了保证线程安全需要额外的同步机制这回降低性能。但是ConcurrentHashMap通过分段所机制在多线程环境下可以实现更高的并发性能不同的线程可以同时访问不同的Segment从而减少了锁竞争的可能性。
# JDK1.8版本
内存结构: hashMap引入了红黑树从Jdk1.8开始hashmap采用数组+ 链表+ 红黑树的结构。当链表长度超过一定阈值8的时候链表会转换为红黑树小于6的时候会转换为链表以提高查找效率。ConcurrentHashMap放弃了分段锁机制采用`CAS + synchronized`的方式保证线程安全内部结构和HashMap一样也引入了红黑树是数组+ 链表+ 红黑树的结构。
线程安全性: ConcurrentHashMap通过CAS和synchronized的方式保证线程安全。在插入元素的时候首先会尝试用CAS更新节点如果CAS失败则使用synchronized锁住当前节点再进行插入操作。
性能: hashmap在单线程环境下由于红黑树的引入当链表较长的时候查找效率会有所提升。ConcurrentHashMap在多线程环境下由于摒弃了分段锁减少了锁的粒度进一步提高了并发性能。同时红黑树的引入也提高了查找效率。