Add article comparing HashMap and ConcurrentHashMap
This commit is contained in:
0
public/api/i/2025/08/09/124cfwm-1.webp
Normal file → Executable file
0
public/api/i/2025/08/09/124cfwm-1.webp
Normal file → Executable 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
0
public/api/i/2025/08/09/124ikdt-1.webp
Normal file → Executable 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
0
public/api/i/2025/08/09/12542r3-1.webp
Normal file → Executable file
|
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
@@ -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是线程安全的
|
||||
25
src/content/posts/Java/集合/HashMap和ConcurrentHashMap的区别.md
Normal file
25
src/content/posts/Java/集合/HashMap和ConcurrentHashMap的区别.md
Normal 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在多线程环境下,由于摒弃了分段锁,减少了锁的粒度,进一步提高了并发性能。同时,红黑树的引入也提高了查找效率。
|
||||
Reference in New Issue
Block a user