• Java之集合(九)LinkedHashMap


      转载请注明源出处:http://www.cnblogs.com/lighten/p/7367525.html

    1.前言

      前一章对Map中的HashMap进行了讲解(虽然只详细介绍了一下红黑树的部分),本章对其子类LinkedHashMap进行介绍。首先我们要明确为什么会有这样一个Map?原因很简单,在HashMap的存储步骤讲解中,可以很容易看出其并不能保证插入map的先后顺序。LinkedHashMap就是来解决这个问题的,其实现方法就是内含一个双向链表,包含所有的Entry键值对,这样迭代的时候就能保证其顺序是插入顺序了。值得一提的是,这个插入顺序并不受到一个键重复插入Map的影响,后面会解释为什么。

    2.LinkedHashMap

      上图就是内含的双向链表了,头尾节点的定义。accessOrder决定了是否将重复插入的键值对返到链表末尾,遍历的时候就产生了是插入顺序,还是access顺序了。true是按照插入顺序,不放在结尾;false是access顺序,放在结尾。

      链表中的一个常见的方法,将结点插入链表尾。

      将其中一个结点用新的结点替换。

      上面这些方法替换了HashMap其自身的方法,使得HashMap的基本操作put,get,remove等使用LinkedHashMap的方法处理,TreeNode方法也进行了兼容。方法比较简单,就不再进行介绍了。

      迭代器的实现方法,也很简单,不再描述,可以看出就是链表的顺序了。

       最后再关注一下accessOrder是如何导致重复键不影响插入顺序的。这还要回到HashMap的put方法。

      putValue方法中有这么一段,如果Map中存在这个键值对,就替换了原键。关键方法是afterNodeAccess,这个方法由LinkedHashMap重写了。

      这个方法就能看出accessOrder决定了是否将重复插入的键放在链表最后,所以当accessOrder为false的时候,不会将重复键放在末尾,是insert顺序。否则移到末尾,是access顺序。顺便提下,默认的LinkedHashMap都是false,是insert顺序。

      最后,还是强调一下LinkedHashMap的实现还是通过HashMap的,其基本方法并没有改变,只是重写了部分方法,将迭代器等重写。区别仅仅在于遍历是有顺序,存储还是通过HashMap的相关方法完成的。

  • 相关阅读:
    VC++学习(16):线程同步与异步套接字
    VC++学习(15):多线程
    VC++学习(12):文件操作
    VC++学习(10):绘图控制
    VC++学习(13):文档串行化
    VC++学习(11):图形的保存和重绘
    VC++学习(18):Active控件
    四大数据库的比较(SQL Server、Oracle、Sybase和DB2)
    Gridview中二级联动
    VS 2008中PDA开发环境的相关配置
  • 原文地址:https://www.cnblogs.com/lighten/p/7367525.html
Copyright © 2020-2023  润新知