HashMap和HashSet遍历元素时是无序的,这恐怕是一个常识了,但是你有没有想过为什么是无序的? TreeMap和LinkedHashMap是有序的,那又为什么是有序的呢?
本节我们从源码分析的角度来理一理这件事情.
首先说HashMap是如何遍历的,一般来说有两种遍历方式,我们用常用的这一种,使用entrySet的iterator方法,如下
1 |
|
1 |
|
1 |
|
参考这张图片
HashMap中元素的遍历是按照从数组起始位置开始,首先将当前bucket下的所有元素遍历完成,然后到下一个bucket,bucket与bucket之间如果为空就跳到下一个bucket,直到将所有的元素遍历出来.显而易见,元素插入的位置并不是这样的顺序,因此才说HashMap是无序的.
TreeMap和LinkedHashMap是如何实现有序的
TreeMap的底层数据结构是一棵红黑树,红黑树上的元素都是有顺序的.
LinkedHashMap底层数据结构就是一个双向链表,元素遍历的顺序就是链表从前到后的顺序,因此也是有序的.