注:本文参考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,赞。

最新文章

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

热门文章

  1. File类-文件基本操作
  2. 学习和研究下unity3d的四元数 Quaternion
  3. google-analytics的使用: 解析页面引入代码
  4. GHOST急速安装win10或win7
  5. 详解CSS中:nth-child的用法
  6. Swift学习(二):自定义扩展方法(Extensions)
  7. C#进阶系列——动态Lamada(二:优化)
  8. 解决 PHPExcel 长数字串显示为科学计数
  9. maven 生成可执行的jar文件
  10. 微信连WiFi expired timestamp 和sign错误小坑解决