深圳租赁住房和建设局网站,自媒体代运营,兰州网络营销网站,慧聪网seo页面优化LinkedHashMap是HashMap的子类#xff0c;上一节初步分析过HashMap#xff0c;这一节分析LinkedHashMap。
LinkedHashMap的数据结构
Entry LinkedHashMap的Entry继承自HashMap的Node#xff0c;除了Node的数据结构之外#xff0c;增加了before、after#xff0c;所以我们…LinkedHashMap是HashMap的子类上一节初步分析过HashMap这一节分析LinkedHashMap。
LinkedHashMap的数据结构
Entry LinkedHashMap的Entry继承自HashMap的Node除了Node的数据结构之外增加了before、after所以我们可以猜测到LinkedHashMap的Entry应该是双向列表结构 static class EntryK,V extends HashMap.NodeK,V {EntryK,V before, after;Entry(int hash, K key, V value, NodeK,V next) {super(hash, key, value, next);}}此外LinkedHashMap定义了首节点和尾结点 transient LinkedHashMap.EntryK,V head;/*** The tail (youngest) of the doubly linked list.*/transient LinkedHashMap.EntryK,V tail;table数组 继承自HashMap,没有变化
数据依然保存在table数组中不同的是table中的对象变成了Entry。
###LinkedHashMap的初始化 与HashMap的初始化方式、以及涉及到的容量、装载因子、扩容阈值等概念基本相同。
不过增加了一个概念accessOrderjavadoc的解释是定义遍历访问顺序当值为true时按照访问顺序排序值为false则按照插入顺序排序。 /*** The iteration ordering method for this linked hash map: tttrue/tt* for access-order, ttfalse/tt for insertion-order.** serial*/final boolean accessOrder;LinkedHashMap赋值
LinkedHashMap的赋值逻辑如下假设待存放的数据为ekey1,value1
检查table数组为空的话初始化指定容量或者默认容量的table数组根据key1的哈希值计算得出算法为容量 - 1 hash(key1)对应的桶。这一步很重要一般来讲优秀的hash算法能够尽可能确保不同的key值得到不同的hash值也就可以确保放入不同的桶内。但是不可避免的可能会存在不同key值得到相同hash值的情况hash冲突key1key2,hash(key1)hash(key2)这种情况下就会放置在相同的桶比如table[5]内。得到桶之后判断桶内是否已经有数据。没有数据则直接新建一个NodenewNode(hash, key1, value1, null)放在桶中结束LinkedHashMap新建的Node是他的Entry对象所以创建对象的过程与HashMap的略有不同创建的是双向链表通过before、after首尾相连并在创建的过程中指定LinkedHashMap的head和tail。否则桶内有数据有两种情况一是为键值key1重复赋值、二是hash冲突。如果是hash冲突则new一个NodenewNode(hash, key1, value1, null)并将其设置为桶内的最后一个Node。如果是重复赋值桶内数据的key值key1则为key1重新赋值value1并返回key1的旧值
与HashMap的赋值过程基本相同不同之处在于除了将数据分配在hash桶之外同时按照存储数据的先后顺序创建双向链表。
从LinkedHashMap获取数据
LinkedHashMap通过key值获取数据的逻辑与HashMap的完全一致
通过getkey方法获取数据的逻辑如下假设要获取的数据keykey1
table数组不为空并且数组长度大于0则采用与put数据相同的算法得到key1值对应的桶。桶内不空则从第一个节点开始检查如果节点key值等于key1则返回该节点的value。如果第一个节点不满足条件则依次检查桶内所有其他节点。桶内空或者桶内不空但是没有找到满足条件的对象应该不可能则返回null表明当前HashMap中不存在key值为key1的对象
所以我们可以看到正如名称给我们的启示一样LinkedHashMap与HashMap的区别就是多了一个链表
我们知道LinkedHashMap能够确保按照存储顺序获取数据而HashMap遍历到的数据是随机的下次我们就具体分析一下其底层原因。