- 持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第29天,点击查看活动详情
前言
LinkedHashSet跟LinkedHashMap都非常相似的继承了HashMap与HashSet方法,并实现了Map与Set的接口,这样它们就是基于HashMap和HashSet下的链表扩展,核心内容还是HashMap与HashSet.
LinkedHashSet
LinkedHashSet的源码相对于LinkedHashMap就简洁了许多,所以先看LinkedHashSet
类图
结构
源码
从类图里看到LinkedHashSet继承了HashSet类实现了Set接口,从结构中看到除了四个构造方法就只实现了一下Set的spliterator方法,而且还是重写了HashSet类的
看看四个构造方法里是怎么出时候LinkedHashSet的
源码中都是调用了父类的构造方法,也就是HashSet的有参构造方法
HashSet的构造方法
这里已经看出来了,这个构造方法就是为了创建LinkedHashMap创建的,而HashSet默认是使用的HashMap,而LinkedHashSet也是使用的LinkedHashMap,这样其实不用看HashSet的内容了,处理逻辑都是HashMap的
LinkedHashMap
类图
结构
源码
LinkedHashMap有五个构造方法,先看默认的无参构造方法
这个默认无参构造方法也是使用的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参数,如下
afterNodeAccess方法会根据判断对链表进行位置调整