JAVA中的有序hash

一.hashMap与linkedHashMap

经过两篇文章的讨论,已经可以清楚的知道hashmap利用hash算法将数据均匀分布。这种分布是无序的,即放入顺序和读取顺序不一致。那么JAVA中有没有又是基于hash又是有序的数据结构喃?有!它就是——linkedHashMap。

hashMap:

JAVA中的有序hash_第1张图片

 

linkedHashMap:

JAVA中的有序hash_第2张图片

二.如何实现有序

linkedhashMap实现有序是使用了经典的一种数据结构——双向链表。

每个节点拥有前后指针,指向直接前驱,直接后继,尾节点的尾指针直接指向头节点。

节点在链表上的顺序就是插入顺序。

JAVA中的有序hash_第3张图片

三.源码

首先可以看到linkedhashmap继承了hashmap,也就是说它就是基于hashmap实现的。

不同的地方是,linkedhashmap的内部节点内基于hashmap的内部节点类多了前后指针。

linkedhashmap没有重写put方法,一个元素put进来,还是调用hashmap的put方法。

可以看到hashmap在put的时候分情况分别会调用几个方法。

JAVA中的有序hash_第4张图片

这几个方法hashmap只给出了空实现,并且在注释上面清楚的写明,是为了linkedhashmap所留

JAVA中的有序hash_第5张图片

然后linkedhashmap重写了这些方法,主要就是拿来操作前后指针,在put的时候指向前后节点。

JAVA中的有序hash_第6张图片

遍历的时候会发现linkedhashMap重写了Iterator,其实过程就是next  next  next......

JAVA中的有序hash_第7张图片

 

至于构造方法中的那个标志位的作用就是拿来切换linkedhashmap的两种读取顺序而已。详细内容可以查询API。

 

 

你可能感兴趣的:(后端)