您当前的位置: 首页 > 

恐龙弟旺仔

暂无认证

  • 1浏览

    0关注

    282博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

JDK源码解析之LinkedHashMap

恐龙弟旺仔 发布时间:2019-01-10 17:28:45 ,浏览量:1

前言:

    在上一篇博客中,我们系统的介绍了HashMap,HashMap是非线程安全的类,一般情况下作为局部变量使用是完全可以的。

    HashMap的存放是无序的,按照一定的规则映射的,所以,遍历其元素的顺序与添加的顺序是不一致的。

    如果我们想按照添加的顺序来遍历元素该如何做呢?

    那就需要使用本次介绍的LinkedHashMap来完成了。

    注意:由于LinkedHashMap大量使用了HashMap的方法,所以不太明白HashMap工作原理的同学,可以先看下笔者另一篇关于HashMap的文章,https://blog.csdn.net/qq_26323323/article/details/86219905 

  1.LinkedHashMap结构分析
public class LinkedHashMap
    extends HashMap
    implements Map{
    
    // 双端链表的头元素
    transient LinkedHashMap.Entry head;

    // 双端链表的尾元素
    transient LinkedHashMap.Entry tail;
    
    // 默认为false,指的是添加顺序;
    // 当指定为true时,访问顺序,这个在后面再详细说明
    final boolean accessOrder;
    
    // 不同于HashMap.Node
    // 继承了HashMap.Node,同时还扩展了自己的属性before、after
    static class Entry extends HashMap.Node {
        Entry before, after;
        Entry(int hash, K key, V value, Node next) {
            super(hash, key, value, next);
        }
    }

    通过对其结构的分析,可以确定,LinkedHashMap就是HashMap与LinkedList的结合体。

    其继承HashMap,通过HashMap来实现基本功能;

    其添加head和tail属性,并且在Entry节点中,添加before和after属性,来实现双向链表的功能。

 

2.LinkedHashMap构造方法
// 1.空参构造
public LinkedHashMap() {
    // 直接调用new HashMap()
    super();
    accessOrder = false;
}

// 2.初始化数组容量
public LinkedHashMap(int initialCapacity) {
    super(initialCapacity);
    accessOrder = false;
}

// 3.初始化数组容量和负载因子
public LinkedHashMap(int initialCapacity, float loadFactor) {
    super(initialCapacity, loadFactor);
    accessOrder = false;
}

// 4.初始化数组容量和负载因子和AccessOrder
public LinkedHashMap(int initialCapacity,
                     float loadFactor,
                     boolean accessOrder) {
    super(initialCapacity, loadFactor);
    this.accessOrder = accessOrder;
}

// 5.以一个Map来初始化
public LinkedHashMap(Map            
关注
打赏
1655041699
查看更多评论
0.0939s