JDK source 之 LinkedHashMap原理浅谈
2024-08-28 03:22:49
注:本文参考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,赞。
最新文章
- 7_nodejs angularjs
- PhoneGap初试!
- Atitit blend mode COLOR_DODGE&#160;混合模式&#160;&#160;“颜色减淡”模式
- Windows 2008远程多用户登录的配置方法(转载)
- 详解Linux安装GCC方法
- IOS 的loadView 及使用loadView中初始化View注意的问题。(死循环并不可怕)
- 第三百零六天 how can I 坚持
- 在ubuntu 12.04 中配置java环境(安装jdk, tomcat, maven, eclipse)
- 非对称加密RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。使用最广泛的是RSA算法
- Java爬虫,信息抓取的实现(转)
- maven的web项目手工发布
- C# into子句
- Xamarin Android Fragment的两种加载方式
- 图像检索(5):基于OpenCV实现小型的图像数据库检索
- SpringBoot热部署:spring-boot-devtools在Idea中热部署方法
- 转载自知乎大神---this 的值到底是什么?一次说清楚
- pycharm 对代码做静态检查
- php常量PHP_EOL
- Linux如何用yum安装软件或服务
- python学习笔记4-内置函数、匿名函数、json处理