注: 下面的源码理解均基于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的特性,有巧妙的扩展出了新特性,这也是我们自己代码设计可以借鉴的地方
相关推荐
主要介绍了 java HashMap,TreeMap与LinkedHashMap的详解的相关资料,这里提供实例代码,帮助大家学习理解 这部分的内容,需要的朋友可以参考下
在理解了#7 介绍的HashMap后,我们来学习LinkedHashMap的工作原理及实现。首先还是类似的,我们写一个简单的LinkedHashMap的程序: LinkedHashMap<String> lmap = new LinkedHashMap(); lmap.put(语文, 1)...
选择集合时,值得理解您要解决的问题。 少量条目的本将显着提高速度。 但是,一旦地图达到1,000或更多,Mootable Hashmap就会真正显示出其优势。 为此,它将利用更多的内存。 如果通过JIT编译之类的操作在循环...
ava基础 基础知识 ...Java集合详解5:深入理解LinkedHashMap和LRU缓存 Java集合详解6:TreeMap和红黑树 Java集合详解7:HashSet,TreeSet与LinkedHashSet Java集合详解8:Java集合类细节精讲 JavaWeb
该文档主要详细总结了Java集合的相关知识,包括Collection和Map接口、Collection接口的子接口List和Set接口以及具体的实现类、存储原理等;Map接口的子接口HashMap、LinkedHashMap、TreeMap、Properties等
理解 LRU 缓存的概念 理解 LFU 缓存的概念 实现 LRU 和 LFU 缓存 看看守卫在列表实现中是如何有用的 工作坊: lfu.workshop , lru.workshop 在实现期间使用list类 答案: lfu.answers , lru.answers 最近最少使用 ...
源码分析:LinkedHashMap 集合框架 (第 14 篇) 源码分析:TreeMap 集合框架 (第 15 篇) 源码分析:Set 集合 集合框架 (第 16 篇) 源码分析:BlockingQueue 接口 集合框架 (第 17 篇) 源码分析:...
对比:Hashtable、HashMap、LinkedHashMap、ConcurrentHashMap、TreeMap (看第六条就可以) HashMap 用什么数据结构实现的 加载因子是什么 HashMap 初始化传入的容量参数的值是就是 HashMap 实际分配的空间么 ...
Java 中 LinkedHashMap 和 PriorityQueue 的区别是什么? ThreadPoolExecutor饱和策略有哪些 可达性分析 成员变量与局部变量的区别有那些? HashMap 的长度为什么是2的幂次方 谈谈JVM中,对类加载器的认识 你...
主要介绍了Java HashMap实现原理的分析,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
LinkedHashMap Java 多线程 多线程中的常见问题 synchronize 关键字原理 多线程的三大核心 对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM ...
LinkedHashMap Java 多线程 多线程中的常见问题 synchronize 关键字原理 多线程的三大核心 对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM ...
LinkedHashMap Java 多线程 多线程中的常见问题 synchronize 关键字原理 多线程的三大核心 对锁的一些认知 ReentrantLock 实现原理 ConcurrentHashMap 的实现原理 线程池原理 深入理解线程通信 交替打印奇偶数 JVM ...
Simple Java 是 Java 常见问题的集合。中文翻译 ##1。 字符串和数组字符串和数组 字符串是通过引用传递的吗?...深入理解Arrays.sort(T[], Comparator < ? super T > c) 常见排序,Collections、Arrays、Tre
11.4.2 实现类LinkedHashMap285 11.4.3 实现类TreeMap286 11.4.4 实现类Properties287 11.5 Collections类288 11.6 泛型概述292 11.7 本章习题300 第12章 12.1 理解线程304 12.1.1 什么是多线程304 12.1.2 进程和...
14.7.4 LinkedHashMap类的使用 304 14.7.5 SortedMap接口与TreeMap类 305 14.7.6 映射的遍历 308 14.8 栈在Java中的实现 309 14.8.1 Stack类的使用 309 14.8.2 Deque接口的使用 310 14.8.3 利用栈计算...