LinkedHashMap是如何实现有序的?
Posted zhangjin1120
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LinkedHashMap是如何实现有序的?相关的知识,希望对你有一定的参考价值。
LinkedHashMap是怎么实现有序的?
LinkedHashMap内部持有两个成员变量,
head
和tail
,是双链表结点。
在插入数据时,仍然调用HashMap的put方法,将数据保存在原先的数组+链表/红黑树的数据结构中,put方法中调用了newNode()
。LinkedHashMap重写了newNode()
方法,在newNode方法中,把新的结点插入双向链表。采用尾插法,保证了后插入的数据,位于双向链表的尾部。遍历时,从head结点开始遍历输出,输出顺序自然就和插入顺序一样。
LinkedHashMap迭代遍历的源码分析
常见的两种用iterator遍历方式:
public static void testOrdered()
LinkedHashMap<Integer, String> map = new LinkedHashMap<>();
map.put(0, "zhangjin");
map.put(1, "lisi");
map.put(2, "wangwu");
map.put(3, "lll");
map.put(4, "aaa");
map.put(5, "bbb");
Iterator iterator = map.entrySet().iterator();
while (iterator.hasNext())
Map.Entry entry = (Map.Entry) iterator.next();
System.out.print(entry.getValue()+" ");
System.out.println();
for (String str : map.values())
System.out.print(str + " ");
entrySet()
返回的是LinkedEntrySet
LinkedEntrySet.iterator()
返回的是LinkedEntryIterator
LinkedEntryIterator
继承了LinkedHashIterator
,所以LinkedEntryIterator.next()
方法,内部调用了父类的nextNode()
方法。
LinkedHashIterator.nextNode()
方法,从head
结点,依次向尾结点遍历,这样就保证了有序遍历。
下面这篇文章写的真不错:
18赞:面试必备:LinkedHashMap源码解析(JDK8)
以上是关于LinkedHashMap是如何实现有序的?的主要内容,如果未能解决你的问题,请参考以下文章