From f75a4bc2af343de06cbe2f72072290510c3db37b Mon Sep 17 00:00:00 2001 From: Omooo <869759698@qq.com> Date: Tue, 2 Jun 2020 12:56:26 +0800 Subject: [PATCH] =?UTF-8?q?Update=20=E9=9B=86=E5=90=88=E6=BA=90=E7=A0=81.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- blogs/Java/口水话/集合源码.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/blogs/Java/口水话/集合源码.md b/blogs/Java/口水话/集合源码.md index b63ea38..74010df 100644 --- a/blogs/Java/口水话/集合源码.md +++ b/blogs/Java/口水话/集合源码.md @@ -7,6 +7,7 @@ 1. ArrayList 2. Vector 3. LinkedList +4. HashMap #### ArrayList @@ -24,3 +25,12 @@ Vector 感觉是一个被人抛弃的类,它在初始化时直接设置了数 #### LinkedList +LinkedList 实现了 Deque 接口,说明它是一个双向链表,每一个 Node 节点都有 prev 和 next 指针,每次 add 或者 remove 时都需要更新前驱和后指针,在指定 index 位置删除时,会区分 index 如果是靠头部比较近,就从头 first 节点遍历删,否则从尾部 last 节点删。使用迭代器时,也是可以使用 ListIterator 从头或从尾遍历。 + +它在新增和删除时,时间复杂度 O(1),而在查询时时间复杂度 O(n)。 + +#### HashMap + +HashMap 底层数据结构是数组 + 链表 + 红黑树。数组的主要作用是方便快速查找,时间复杂度是 O(1),默认大小是 16,数组的下表索引是通过 key 的 hashCode 计算出来的,数组元素叫做 Node,当多个 key 的 hashCode 一致,但 key 值不相同时,即发生了 hash 冲突时,单个 Node 就会转化为链表,链表的查询复杂度是 O(n),当链表的长度大于等于 8 并且数组的大小超过 64 时,链表就会转化为红黑树,红黑树的查询复杂度是 O(log(n)),简单来说,最坏的查询次数相当于红黑树的最大深度。 + +HashMap 非线程安全,如果需要满足线程安全,可以用 Collections.synchronizedMap 使得 HashMap 具有线程安全的能力,或者使用 ConcurrentHashMap。 \ No newline at end of file