LinkedHashSet与LinkedHashMap

116 阅读2分钟
  • 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情

前言

LinkedHashSet跟LinkedHashMap都非常相似的继承了HashMap与HashSet方法,并实现了Map与Set的接口,这样它们就是基于HashMap和HashSet下的链表扩展,核心内容还是HashMap与HashSet.

LinkedHashSet

LinkedHashSet的源码相对于LinkedHashMap就简洁了许多,所以先看LinkedHashSet

类图

image.png

结构

image.png

源码

从类图里看到LinkedHashSet继承了HashSet类实现了Set接口,从结构中看到除了四个构造方法就只实现了一下Set的spliterator方法,而且还是重写了HashSet类的

看看四个构造方法里是怎么出时候LinkedHashSet的

image.png

源码中都是调用了父类的构造方法,也就是HashSet的有参构造方法

HashSet的构造方法

image.png

这里已经看出来了,这个构造方法就是为了创建LinkedHashMap创建的,而HashSet默认是使用的HashMap,而LinkedHashSet也是使用的LinkedHashMap,这样其实不用看HashSet的内容了,处理逻辑都是HashMap的

LinkedHashMap

类图

image.png

结构

image.png

源码

LinkedHashMap有五个构造方法,先看默认的无参构造方法

image.png

这个默认无参构造方法也是使用的HashMap构建的,只不过定义了局部变量accessOrder参数为false,这个参数的意思是

此链接哈希映射的迭代排序方法:访问顺序为 true,插入顺序为 false。

当accessOrder为true时,每次调用get方法时都会调用该方法,将访问的Node移动到最后,使之成为尾部节点,从而改变了数据在LinkedHashMap中的存储顺序。

对平时简单使用LinkedHashMap来说一般该值为false,对数据的存储顺序没什么影响,它的作用会在LruCache上体现,但是什么又是LruCache。     

LRUCache的目的就是当缓存中的数据量达到一定的程度时,添加新的数据会将最近最少被使用的旧数据删除,以保障Cache中的数据都是经常需要的数据,提高命中率。

所以说accessOrder的作用就是控制访问顺序,设置为true后每次访问一个元素,就将该元素所在的Node变成最后一个节点,改变该元素在LinkedHashMap中的存储顺序。

其他四个有参构造方法也都是使用的HashMap构建,并且put方法是使用的HashMap的,get方法进行了重写并用到了上面的accessOrder参数,如下

image.png

afterNodeAccess方法会根据判断对链表进行位置调整

image.png