LinkedHashMap是HashMap的子类,上一节初步剖析过HashMap,这一节剖析LinkedHashMap。
LinkedHashMap的数据结构
Entry
LinkedHashMap的Entry继承自HashMap的Node,除了Node的数据结构之外,减少了before、after,所以咱们能够猜测到LinkedHashMap的Entry应该是双向列表构造:
static class Entry<K,V> extends HashMap.Node<K,V> { Entry<K,V> before, after; Entry(int hash, K key, V value, Node<K,V> next) { super(hash, key, value, next); } }
此外,LinkedHashMap定义了首节点和尾结点:
transient LinkedHashMap.Entry<K,V> head; /** * The tail (youngest) of the doubly linked list. */ transient LinkedHashMap.Entry<K,V> tail;
table数组
继承自HashMap,没有变动!
数据仍然保留在table数组中,不同的是table中的对象变成了Entry。
LinkedHashMap的初始化
与HashMap的初始化形式、以及波及到的容量、装载因子、扩容阈值等概念基本相同。
不过,减少了一个概念accessOrder,javadoc的解释是定义遍历拜访程序,当值为true时依照拜访程序排序,值为false则依照插入程序排序。
/** * The iteration ordering method for this linked hash map: <tt>true</tt> * for access-order, <tt>false</tt> for insertion-order. * * @serial */ final boolean accessOrder;
LinkedHashMap赋值
LinkedHashMap的赋值逻辑如下(假如待寄存的数据为e<key1,value1>):
- 查看table数组为空的话,初始化指定容量或者默认容量的table数组
- 依据key1的哈希值计算得出(算法为(容量 - 1) & hash(key1))对应的桶。这一步很重要,一般来讲优良的hash算法可能尽可能确保不同的key值得到不同的hash值,也就能够确保放入不同的桶内。然而不可避免的,可能会存在不同key值得到雷同hash值的状况(hash抵触:key1<>key2,hash(key1)=hash(key2)),这种状况下就会搁置在雷同的桶(比方table[5])内。
- 失去桶之后,判断桶内是否曾经有数据。
- 没有数据则间接新建一个Node:newNode(hash, key1, value1, null),放在桶中,完结
- LinkedHashMap新建的Node是他的Entry对象,所以创建对象的过程与HashMap的略有不同:创立的是双向链表(通过before、after首尾相连),并在创立的过程中指定LinkedHashMap的head和tail。
- 否则,桶内有数据,有两种状况:一是为键值key1反复赋值、二是hash抵触。
- 如果是hash抵触,则new一个Node:newNode(hash, key1, value1, null)并将其设置为桶内的最初一个Node。
- 如果是反复赋值(桶内数据的key值=key1),则为key1从新赋值value1,并返回key1的旧值
与HashMap的赋值过程基本相同,不同之处在于:除了将数据调配在hash桶之外,同时依照存储数据的先后顺序创立双向链表。
从LinkedHashMap获取数据
LinkedHashMap通过key值获取数据的逻辑与HashMap的完全一致
通过get(key)办法获取数据的逻辑如下(假如要获取的数据key=key1):
- table数组不为空并且数组长度大于0,则采纳与put数据雷同的算法失去key1值对应的桶。
- 桶内不空则从第一个节点开始查看,如果节点key值等于key1,则返回该节点的value。如果第一个节点不满足条件,则顺次查看桶内所有其余节点。
- 桶内空,或者桶内不空然而没有找到满足条件的对象(应该不可能)则返回null,表明以后HashMap中不存在key值为key1的对象
所以咱们能够看到,正如名称给咱们的启发一样,LinkedHashMap与HashMap的区别就是多了一个链表
大家晓得LinkedHashMap可能确保依照存储程序获取数据,而HashMap遍历到的数据是随机的,下次咱们就具体分析一下其底层起因。