linkedhashmap底层原理
时间: 2023-08-08 21:11:50 浏览: 118
LinkedHashMap 是 Java 中的一个实现了 Map 接口的具体类,它以哈希表和双向链表的结构来存储键值对。
LinkedHashMap 的底层原理如下:
1. LinkedHashMap 继承自 HashMap,因此它同样使用了哈希表来存储键值对。
2. LinkedHashMap 维护了一个双向链表,用来保持键值对的顺序。每个节点都包含了前驱节点和后继节点的引用。
3. 在哈希表中,每个桶(bucket)都是一个链表的头节点。当发生哈希冲突时,新的键值对会被添加到链表的尾部。
4. 双向链表中的节点按照插入顺序进行排序。这意味着当遍历 LinkedHashMap 时,可以按照插入顺序或访问顺序来获取元素。
5. LinkedHashMap 还提供了一个布尔型变量 accessOrder,用于指定是按照插入顺序还是访问顺序来排序。当 accessOrder 为 true 时,表示按照访问顺序排序;为 false 时,表示按照插入顺序排序。
6. 当调用 get、put 或其他与访问相关的方法时,如果 accessOrder 为 true,则会将访问到的节点移动到链表的尾部,以保持访问顺序。
通过使用哈希表和双向链表,LinkedHashMap 在保持键值对的插入顺序或访问顺序的同时,仍然具备了快速的查找和插入操作。
相关问题
LinkedHashMap底层原理
LinkedHashMap底层是基于哈希表实现的,同时也是基于双向链表实现的。其中,哈希表用来存储键值对,双向链表用来维护键值对的插入顺序。
具体来说,LinkedHashMap内部维护了一个Entry数组,每个Entry包含了键值对的信息,包括key、value、hash等。同时,每个Entry还包含了前后指针,用于维护插入顺序。
在插入一个键值对时,会先根据hash值找到对应的桶,如果桶为空,则直接将Entry插入到该桶中。如果桶不为空,则需要遍历该桶中的所有Entry,找到与新插入Entry的key相同的Entry,如果找到了,则更新该Entry的value,否则将新的Entry插入到链表的尾部。
在访问一个键值对时,会先根据hash值找到对应的桶,然后遍历该桶中的所有Entry,找到与指定key相同的Entry,并返回其value。同时,访问一个键值对时,会将该Entry移动到链表的尾部,以维护插入顺序。
需要注意的是,由于LinkedHashMap采用的是双向链表,因此在遍历或删除键值对时,可以比HashMap更高效。但是,由于需要维护链表,因此LinkedHashMap的内存消耗可能会比HashMap更高。
LinkedHashMap底层原理 jdk1.8
LinkedHashMap 是继承自 HashMap 的类,在 HashMap 的基础上通过维护一条双向链表来解决无法保持遍历顺序和插入顺序一致的问题,并提供了对访问顺序的支持。在 JDK 1.8 版本中,LinkedHashMap 使用了和 HashMap 相同的底层数据结构,即拉链式散列结构,并在解决长链表问题上引入了红黑树优化。这样,LinkedHashMap 可以提供高效的增删改查操作,并且在遍历时可以按照插入或访问的顺序进行遍历。
LinkedHashMap 的底层数据结构和 HashMap 一样,都是使用数组加链表或红黑树的方式来处理冲突。每个数组元素都是一个链表或红黑树的头节点,每个节点包含一个键值对。当插入或查找元素时,根据键的哈希值找到对应的数组下标,然后在链表或红黑树中进行操作。
在 LinkedHashMap 中,除了继承了 HashMap 的方法,还覆写了部分方法来维护双向链表。具体来说,LinkedHashMap 在 put、remove 和 get 等方法中添加了对双向链表的操作,以保证插入和访问的顺序。当插入一个新的元素时,LinkedHashMap 会将该元素插入到链表的末尾;当访问一个已有元素时,LinkedHashMap 会将该元素移动到链表的末尾。通过这种方式,LinkedHashMap 可以保持元素的插入或访问顺序,实现了有序遍历的效果。
总结起来,LinkedHashMap 的底层原理是在 HashMap 的基础上通过维护一条双向链表来实现插入和访问的顺序,而在 JDK 1.8 中,LinkedHashMap 使用了和 HashMap 相同的底层数据结构,即拉链式散列结构,并引入了红黑树优化。这样,LinkedHashMap 可以提供高效的增删改查操作,并且在遍历时可以按照插入或访问的顺序进行遍历。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [LinkedHashMap(JDK1.8)源码解析](https://blog.csdn.net/qq_41242680/article/details/114637171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文