注: 下面的源码理解均基于jdk1.8的源码
HashMap是常用的数据集合,但是是无序, LinkedHashMap就是在HashMap上进行的一种扩展,在HashMap特性的基础上增加了有序这个特性(还可以根据最新使用自动排序)设计十分巧妙
1 LinkedHashMap继承自HashMap
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V> {
2 LinkedHashMap 每个节点Node
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
LinkedHashMap 的node继承了HashMap的node,在原来的基础上增加了before和after引用,实现了双向链表
3 LinkedHashMap 存储结构还是HashMap的数组,每个node通过链表链接,LinkedHashMap 并没有重新put方法,而是在newNode()方法,与HashMap不同的是在HashMap新加节点的基础上(给数组index对应的赋值),设置了after,before引用,形成了链表
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) { LinkedHashMap.Entry<K,V> p = new LinkedHashMap.Entry<K,V>(hash, key, value, e); linkNodeLast(p); return p; }
4 LinkedHashMap get方法进行了重新,不过在不使用accessOrder的时候实现还是HashMap的实现,直接使用hash获取index
public V get(Object key) { Node<K,V> e; if ((e = getNode(hash(key), key)) == null) return null; if (accessOrder) afterNodeAccess(e); return e.value; }
5 遍历LinkedHashMap jdk1.8提供的forEach是直接遍历链表,1.8之前的写法entrySet()进行遍历, LinkedHashMap 重写了entrySet()方法
public Set<Map.Entry<K,V>> entrySet() { Set<Map.Entry<K,V>> es; return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es; }
返回的是一个有序的LinkedEntrySet,确保返回的数据是有序的
总结: 感觉linkedHashMap的扩展做的很巧妙,既不失HashMap的特性,有巧妙的扩展出了新特性,这也是我们自己代码设计可以借鉴的地方
相关推荐
**HashMap与LinkedHashMap的区别** HashMap是Java集合框架中的一员,它是基于哈希表实现的,提供了快速的插入、删除和查找操作,平均时间...在理解和使用时,需要注意其内部结构和排序方式,以便更好地利用其特性。
理解和掌握`LinkedHashMap`可以帮助开发者在处理需要有序Map的场景时做出明智的选择,优化程序的效率和逻辑。在实际编程中,应根据需求选择是否使用`accessOrder`属性,以便在插入顺序和访问顺序之间进行权衡。
在Java编程语言中,`HashMap`、`TreeMap`和`LinkedHashMap`都是`java.util.Map`接口的实现,它们提供了不同的数据存储和访问策略。本文将深入探讨这三种数据结构的特点、工作原理以及适用场景。 1. **HashMap** `...
《深入解析Java的LinkedHashMap》 HashMap作为Java中常用的键值对存储结构,以其高效的查找速度赢得了广大开发者们的...在理解HashMap的基础上,深入学习LinkedHashMap的内部机制,能够更好地应对各种数据结构的需求。
Java LinkedHashMap 是一个根据插入顺序...通过深入理解 `LinkedHashMap` 的源码,开发者可以更好地优化程序性能,尤其是在处理大量数据和需要特定顺序的场景下。同时,对于提升 Java 开发技巧和经验也是大有裨益的。
LinkedHashMap的基本实现思想是多态,可以说,理解多态再去理解LinkedHashMap原理会事半功倍。 在LinkedHashMap中,每个元素是一个Entry对象,Entry对象中包含了Key、Value、Hash值、之前的Entry对象和之后的Entry...
在理解了#7 介绍的HashMap后,我们来学习LinkedHashMap的工作原理及实现。首先还是类似的,我们写一个简单的LinkedHashMap的程序: LinkedHashMap<String> lmap = new LinkedHashMap(); lmap.put(语文, 1)...
这种方法简单直观,易于理解。以下是一个典型的使用`keySet()`遍历`HashMap`的例子: ```java Map, String> map = new HashMap(); for (int i = 0; i ; i++) { map.put("key" + i, "value" + i); } Iterator...
通过阅读和理解这个项目的源代码,我们可以学习到如何在实际编程问题中有效地利用`LinkedHashMap`,以及如何设计和实现算法来解决特定问题。同时,这也是一个很好的机会去了解单元测试和代码组织的最佳实践。
`LinkedHashMap`是Java编程语言中`java.util`包下的一个接口实现类,它是`HashMap`的一个子类,继承自`AbstractMap`并实现了`Map`接口。...理解它的工作原理和适用场景,有助于在编程时做出更恰当的选择。
**LinkedHashMap概述** LinkedHashMap是Java集合框架中的一员,它是HashMap的一个子类,同时结合了...在面试或实际开发中,理解LinkedHashMap的工作原理和特点,对于优化数据结构的使用和提升代码质量具有重要意义。
LRU (Least Recently Used) 算法是一种常用的缓存淘汰策略,它的核心思想是优先淘汰...在 Java 中,`LinkedHashMap` 是实现 LRU 缓存的一种高效方式,但也需要理解其内部机制,以便在面试或特定场景下进行自定义实现。
选择集合时,值得理解您要解决的问题。 少量条目的本将显着提高速度。 但是,一旦地图达到1,000或更多,Mootable Hashmap就会真正显示出其优势。 为此,它将利用更多的内存。 如果通过JIT编译之类的操作在循环...
Java编程语言的基础学习是成为Java开发者的必要步骤,其中对数据结构的理解至关重要,特别是Map接口的实现类。本文将深入探讨Java中Map的几个重要子类:LinkedHashMap和TreeMap,以及Set接口的相关实现。 首先,Map...
理解这个知识点对于优化应用的数据传输流程至关重要。 首先,Map接口在Java中提供了若干实现类,如HashMap、LinkedHashMap等。HashMap是无序的,而LinkedHashMap则保持了插入顺序或者按照访问顺序排序。在Intent中...
- **Map接口**:熟悉HashMap、TreeMap、LinkedHashMap的区别,理解键值对的概念。 - **泛型**:理解泛型的基本概念,知道如何定义泛型类、泛型方法和泛型通配符。 4. **多线程** - **线程创建**:掌握通过Thread...
在"深入Java集合学习系列(四):LinkedHashMap的实现原理_尚硅谷_张晓飞.pdf"中,你将深入理解LinkedHashMap的内部双向链表结构及其与HashMap的区别。 总结起来,这个学习系列将帮助你全面理解Java集合框架中的...
6. **LinkedHashMap的链接机制**:理解双向链表的结构和插入、删除节点的逻辑。 7. **访问顺序和插入顺序**:观察LinkedHashMap如何根据访问顺序更新元素的位置。 通过深入学习这些源码,不仅可以帮助我们理解数据...
通过分析`LRU.java`,我们可以学习如何在实际项目中应用LRU缓存策略,理解如何利用`LinkedHashMap`实现高效的缓存管理,并了解LRU算法的工作机制。此外,还可以学习到如何处理内存限制下的数据存储问题,这对优化...