JAVA8 linkedhashmap 源码阅读笔记
来源:互联网 发布:八爪鱼数据抓取 知乎 编辑:程序博客网 时间:2024/06/08 13:54
LinkedHashMap继承HashMap
LinkedHashMap底层数据存储算法依旧是hash算法,只是LinkedHashMap通过类似链表连接维持对元素插入顺序的存储
HashMap源码解读
一:新增的三个成员变量
- transient LinkedHashMap.Entry< K,V> head; // 指向头结点的地址
- transient LinkedHashMap.Entry< K,V> tail; // 指向尾节点的地址
- final boolean accessOrder; // accessOrder为true时,按访问顺序排序,false时,按插入顺序排序(默认false)
二: 重写HashMap中用于存储数据的内部类
/** * 该类继承自HashMap.Node<K,V> */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); } }
三:构造方法
/** * 默认按照插入顺序排序 */public LinkedHashMap(int initialCapacity, floatloadFactor){ super(initialCapacity, loadFactor); accessOrder = false; } /** * 第三个参数为 true 意味着将按照访问顺序排序 * 既你访问过某个元素 将该元素所处位置置于链表尾端 */ public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) { super(initialCapacity, loadFactor); this.accessOrder = accessOrder; }
四:get方法
public V get(Object key) { Node<K,V> e; // 若key为空 返回null if ((e = getNode(hash(key), key)) == null) return null; // 若accessOrder 为true 执行 if (accessOrder) // 将传入节点e放在链表最后 afterNodeAccess(e); return e.value; }
五:节点构造方法
/** * 构造新节点方法 */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; }
源码阅读到此结束:以下是我对LinkedHashMap自己的一些理解
- HashMap使用哈希表来存储数据,并用拉链法来处理冲突。LinkedHashMap继承自HashMap,同时自身有一个链表,使用链表存储数据,不存在冲突。LinkedList和LinkedHashMap一样使用一个双向循环链表,但存储的上一个节点和一下一个节点的引用地址。所以HashMap和LinkedHashMap是Map。
- accessOrder 属性 默认为false,accessOrder为true时,取出一个数据将该数据放入链表末尾
//展示案例 LinkedHashMap<Integer, Object> map = new LinkedHashMap<Integer, Object>(16, 0.75F, true); for (int i = 0; i < 20; i++) { map.put(i, null); } map.keySet().forEach(e -> System.out.print(e + ",")); map.get(5); map.get(6); System.out.println(); map.keySet().forEach(e -> System.out.print(e + ",")); /** * console * 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19, * 0,1,2,3,4,7,8,9,10,11,12,13,14,15,16,17,18,19,5,6, */
阅读全文
0 0
- JAVA8 linkedhashmap 源码阅读笔记
- Java8 - LinkedHashMap源码
- Java8源码-LinkedHashMap
- JAVA8 hashmap源码阅读笔记(红黑树链表)
- LinkedHashMap源码阅读
- LinkedHashMap源码阅读总结
- java8 ArrayList源码阅读
- java8 LinkedList源码阅读
- java8 ArrayList源码阅读
- java8 LinkedList源码阅读
- java8 ArrayList源码阅读
- LinkedHashMap源码阅读总接
- Java8实战 阅读笔记
- LinkedHashMap 源码学习笔记
- Java8 Iterable接口源码阅读
- Java8 Iterator接口源码阅读
- Java8 Consumer接口源码阅读
- Java8源码阅读之HashMap
- 26. Remove Duplicates from Sorted Array
- 【C语言】模拟登陆程序(简易)
- 关于validator验证器操作
- Java(Android)线程池
- php 二分法查找数组中某数值 案例分析
- JAVA8 linkedhashmap 源码阅读笔记
- POJ 3922 A simple stone game(K倍减法游戏)
- Kafka学习(一):Kafka背景及架构介绍
- zabbix变量 【转】
- MySQL的主从复制(gtid)
- JQuery入门(二)
- JAVA 代理模式
- 【C语言】最大公约数和最小公倍数
- Android保存Bitmap为本地文件