JDK source 之 LinkedHashMap原理浅谈
2016-04-01 00:23
1061 查看
注:本文参考
LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的功能。
LinkedHashMap中的内部类Entry大概如下,可以看到都是基于链表(数据结构意义上的)节点的操作:
当accessOrder为true的时候,当对map进行get和put操作都会将对应的kv移动到最map最前端。这种数据的移动影响到了数据的数据的遍历,比如foreach和containsValue会先查到最近最新被访问的元素。
还有一个点是,当put数据的时候内部有addEntry方法调用如下逻辑:
可以看到,返回值永远为false,目的是为了扩展。继承LinkedHashMap重写removeEldestEntry方法,即可以非常方便的实现一个LRU,赞。
JDK1.7.0_45源码。
LinkedHashMap是基于HashMap实现的数据结构,与HashMap主要的不同为每个Entry是使用双向链表实现的,并且提供了根据访问顺序进行排序的功能。
// 双向链表 private transient Entry<K,V> header; // 如果为true,按照访问顺序排序;如果为false,按照插入顺序排序。默认为false,可以在构造函数中设置。 private final boolean accessOrder;
LinkedHashMap中的内部类Entry大概如下,可以看到都是基于链表(数据结构意义上的)节点的操作:
Entry<K,V> before, after; private void remove() { before.after = after; after.before = before; } private void addBefore(Entry<K,V> existingEntry) { after = existingEntry; before = existingEntry.before; before.after = this; after.before = this; } void recordAccess(HashMap<K,V> m) { LinkedHashMap<K,V> lm = (LinkedHashMap<K,V>)m; if (lm.accessOrder) { lm.modCount++; remove(); addBefore(lm.header); } } void recordRemoval(HashMap<K,V> m) { remove(); }
当accessOrder为true的时候,当对map进行get和put操作都会将对应的kv移动到最map最前端。这种数据的移动影响到了数据的数据的遍历,比如foreach和containsValue会先查到最近最新被访问的元素。
还有一个点是,当put数据的时候内部有addEntry方法调用如下逻辑:
if (removeEldestEntry(eldest)) { removeEntryForKey(eldest.key); } // 调用方法如下: protected boolean removeEldestEntry(Map.Entry<K,V> eldest) { return false; }
可以看到,返回值永远为false,目的是为了扩展。继承LinkedHashMap重写removeEldestEntry方法,即可以非常方便的实现一个LRU,赞。
相关文章推荐
- Java的接口回调与回调函数的解析
- eclipse导入android工程无法生成R文件
- spring 定时任务的配置
- Spring 4 支持的 Java 8 特性
- 3.1java数据类型-注释-命名规范-简介
- Java——面向对象
- The substring() Method in JDK 6 and JDK 7
- Strange java.lang.ArrayIndexOutOfBoundsException thrown on jetty startup
- 简单工厂模式——加减乘除
- Supported on JUnit 4.9 through Spring 4.12
- Java 8 特性—— Streams 构造树结构
- eclipse的插件未安装成功
- XStream基本使用
- Java入门基础
- Java运算符
- 探秘Collections.sort
- 各种排序算法的分析及java实现
- JAVA获取指定格式日期
- [javaEE] web应用的目录结构&配置虚拟主机
- spring事务详解