LinkedHashMap,总的来说,LinkedHashMap底层是使用HashMap+LinkedList实现的。用HashMap维护数据,用LinkedList来维护数据插入的顺序。
一、特点总结:
1、LinkedHashMap的结构是数组+链表(+红黑树)+双向链表。双向链表是用来维护元素的顺序的。HashMap的元素是无序的,LinkedHashMap的元素是有序的。LinkedHashMap的存取数据的方式还是跟HashMap一致。
2、和HashMap的不同之处有:遍历方式不一样(扩容是用到遍历),HashMap根据按数组顺序来遍历,如果遇到链表,则依次遍历链表中的元素,完了之后继续遍历数组的元素。而LinkedHashMap是按双向列表来遍历的,所以LinkedHashMap遍历的性能比HashMap高一点,因为HashMap中有空元素。
3、LinkedHashMap中双向链表的顺序是按元素添加的顺序的,新添加的元素被加到双向链表的末尾。LinkedHashMap还有一个accessOrder属性,可以在new LinkedHashMap的时候传进去,accessOrder默认为false,表示访问元素不改变双向链表中元素的顺序,如果accessOrder为true,则访问元素的时候,即get一个元素的时候,会把该元素移动(先删除后添加,修改before和after指向)到双向链表的末尾。
4、LinkedHashMap和HashMap都是线程不安全的。
二、使用场景:
可以使用LinkedHashMap来实现FIFO和LRU缓存算法。
FIFO缓存算法:如果链表有长度限制的话,最新添加的元素在链表头,最旧的元素在链表尾,最旧的元素被首先删除。
LRU缓存算法:最近最少使用(被删)。如果链表有长度限制的话,最新添加的元素在链表的头部,如果一个元素被访问了,那么这个元素会被移动到链表头部,链表尾部的元素(最近最少被添加或访问)首先被删除。
如果accessOrder设置为false就是FIFO算法。
如果accessOrder设置为true就是LRU算法。