diff --git a/public/api/i/2025/08/09/124cfwm-1.webp b/public/api/i/2025/08/09/124cfwm-1.webp old mode 100644 new mode 100755 diff --git a/public/api/i/2025/08/09/124ikdt-1.webp b/public/api/i/2025/08/09/124ikdt-1.webp old mode 100644 new mode 100755 diff --git a/public/api/i/2025/08/09/12542r3-1.webp b/public/api/i/2025/08/09/12542r3-1.webp old mode 100644 new mode 100755 diff --git a/src/content/posts/Java/集合/ArrayList和LinkedList的区别.md b/src/content/posts/Java/集合/ArrayList和LinkedList的区别.md index 3b1905e..2683512 100644 --- a/src/content/posts/Java/集合/ArrayList和LinkedList的区别.md +++ b/src/content/posts/Java/集合/ArrayList和LinkedList的区别.md @@ -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是线程安全的 \ No newline at end of file diff --git a/src/content/posts/Java/集合/HashMap和ConcurrentHashMap的区别.md b/src/content/posts/Java/集合/HashMap和ConcurrentHashMap的区别.md new file mode 100644 index 0000000..c5fed56 --- /dev/null +++ b/src/content/posts/Java/集合/HashMap和ConcurrentHashMap的区别.md @@ -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在多线程环境下,由于摒弃了分段锁,减少了锁的粒度,进一步提高了并发性能。同时,红黑树的引入也提高了查找效率。 \ No newline at end of file