LinkedHashMap为什么是有序的(与put先后顺序一致)()

  本篇文章为你整理了LinkedHashMap为什么是有序的(与put先后顺序一致)()的详细内容,包含有 LinkedHashMap为什么是有序的(与put先后顺序一致),希望能帮助你了解 LinkedHashMap为什么是有序的(与put先后顺序一致)。

   本文版权归 远方的风lyh和共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作,如有错误之处忘不吝批评指正!

  

   首先呢,明白一点 LinkedHashMap是HashMap的子类,也就是说它就是一个HashMap(所以还是要对HashMap源码有一定了解),至于它可以保证(有序)先后顺序,只能说儿子比老子优秀!虎父无犬子,儿子在父亲的基业上又有了独到之处!原因呢?下面一起看看源码((基于jdk1.8)就知晓了!(看源码一定要有耐心,第一次看可能看不懂,后面再看可能还是看不懂,但是别放弃治疗)。

  

  

public class LinkedHashMap K,V 

 

   extends HashMap K,V

   implements Map K,V

  }

 

   变量分析

   LinkedHashMap在HashMap基础上扩展的这两个成员变量要特别注意,这两个变量是保证有序的基础

  

 /**

 

   * The head (eldest) of the doubly linked list.
* 记录第一个 key—value 对象关于LinkedHashMap.Entry K,V 的结构接下来就会分析
*/

 

  

 transient LinkedHashMap.Entry K,V head; /** * The tail (youngest) of the doubly linked list.
 * 保存最后一个 key—value 对象

 

   transient LinkedHashMap.Entry K,V tail;

 

  

   LinkedHashMap.Entry K,V 结构:

   它继承了HashMap.Node K,V , 添加了两个LinkedHashMap.Entry K,V 用来记录它的前一个 和后一个put进入来的key-value对象(LinkedHashMap.Entry K,V ),在在结构设计上保证了LinkedHashMap有序的可实现

  

 static class Entry K,V extends HashMap.Node K,V {
 //它的前一个 和后一个put进入来的key-value对象

 

   Entry K,V before, after;

   Entry(int hash, K key, V value, Node K,V next) {

   super(hash, key, value, next);

   }

 

   附上HashMap.Node K,V

  

static class Node K,V implements Map.Entry K,V {

 

   final int hash;

   final K key;

   V value;

   Node K,V next;

   Node(int hash, K key, V value, Node K,V next) {

   this.hash = hash;

   this.key = key;

   this.value = value;

   this.next = next;

   //省略。。。。。。。

   }

 

  

   了解完结构我们再来看看它在代码中是如何实现的,LinkedHashMap是HashMap的子类 ,在放入key-value时,它复用了HashMap的put方法

  

public V put(K key, V value) {

 

   return putVal(hash(key), key, value, false, true);

  
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,

   boolean evict) {

   Node K,V [] tab; Node K,V int n, i;

   if ((tab = table) == null (n = tab.length) == 0)

   n = (tab = resize()).length;

   if ((p = tab[i = (n - 1) hash]) == null)

   //这里要格外注意 LinkedHashMap复写了HashMap的

   //newNode(hash, key, value, null) 方法

   tab[i] = newNode(hash, key, value, null);

   //......

   }

 

  

 LinkedHashMap复写了HashMap的newNode(hash, key, value, null) 方法,代码如下:

 

  

 1 Node K,V newNode(int hash, K key, V value, Node K,V e) {

 

   2 LinkedHashMap.Entry K,V p =

   3 new LinkedHashMap.Entry K,V (hash, key, value, e);

   4 linkNodeLast(p);

   5 return p;

   7 /***有序的实现核心***/

   8 private void linkNodeLast(LinkedHashMap.Entry K,V p) {

   9 LinkedHashMap.Entry K,V last = tail;

  10 tail = p;

  11 if (last == null)

  12 head = p;

  13 else {

  14 p.before = last;

  15 last.after = p;

  17 }

 

   举一个场景来说明上面的有序核心实现方法,比如说有这么一个场景: 一个班有 1号小明同学 2号张三 3号小红 4号李四同学,老师要知道学生进入教师的先后顺序。老师在黑板上写了 两个词 head,tail两个字段 规定:

   1.第一个来的在 head来的在head、tail写上自己的名字

   2.第二个及后续到的, 看到黑板上的tail字段后,找到这个同学(这个同学记住我之后到的 after) 通知自己到了(并记住在我之前的是这个同学before) 并修改tail字段为自己的名字

   例子:

   1.小明同学 第一个到 ,在黑板上 head,tail 都写下 小明

   2.张三到了之后看到 tail是小明 记住 自己上一个(before)是小明 ,并修改tail为张三 ,通知小明,小明记下来自己的后面(afte)r是张三

   3小红到了看到tail是张三 记住自己上一个(before)是张三 并修改tail为小红,通知张三,张三记下来自己的后面(after)是小红

   4李四到了。。。。。。。

   老师来了上课 看到head上写的是小明 并询问 小明 你后面是谁 , 小明回:小红 再询问 小红 ....知道 询问到李四 结束

   老师就知道了学生进入教室的顺序 小明- 张三- 小红- 李四。

  
本文版权归作者和共有,欢迎转载,但未经作者同意必须保留此段声明,且在页面明显位置给出原文链接。

  以上就是LinkedHashMap为什么是有序的(与put先后顺序一致)()的详细内容,想要了解更多 LinkedHashMap为什么是有序的(与put先后顺序一致)的内容,请持续关注盛行IT软件开发工作室。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: