linkedHashMap迭代遍历的源码分析linkedHashMap内部持有两个成员变量,head和tail,是双链表结点。
在插入数据时,仍然调用HashMap的put方法,将数据保存在原先的数组+链表/红黑树的数据结构中,put方法中调用了newNode()。linkedHashMap重写了newNode()方法,在newNode方法中,把新的结点插入双向链表。采用尾插法,保证了后插入的数据,位于双向链表的尾部。遍历时,从head结点开始遍历输出,输出顺序自然就和插入顺序一样。
常见的两种用iterator遍历方式:
public static void testOrdered() {
linkedHashMap 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)



