• 【深入Java基础】LinkedHashMap的特点与原理


    LinkedHashMap的特点与原理

    一般来说HashMap的无序的,及内部的存储顺序和输出顺序不一定相同(除非输入key的hash值是有序的)。而LinkedHashMap则是有序的。LinkedHashMap同样支持null键和值,并且值可以重复,它也是不同步的。

    它的有序性表现为两种:

    1.遍历输出的顺序与put顺序一致

    2.按访问顺序输出

    按输入顺序遍历输出,这个好理解:

        LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>();
            linkedHashMap.put(1,"aa");
            linkedHashMap.put(100,"bb");
            linkedHashMap.put(2,"cc");
            linkedHashMap.put(3,"dd");
    
            Iterator iterator = linkedHashMap.entrySet().iterator();
            while (iterator.hasNext()){
                Map.Entry entry = (Map.Entry) iterator.next();
                System.out.println(entry.getKey()+"="+entry.getValue());
            }

    输出:

        1=aa
        100=bb
        2=cc
        3=dd

    按照访问顺序输出,就是被访问的entry会被链表链接到尾部:

        LinkedHashMap<Integer,String> linkedHashMap = new LinkedHashMap<>(16, 0.75f, true);
            linkedHashMap.put(1,"aa");
            linkedHashMap.put(100,"bb");
            linkedHashMap.put(2,"cc");
            linkedHashMap.put(3,"dd");
    
            linkedHashMap.get(1);
    
            Iterator iterator = linkedHashMap.entrySet().iterator();
            while (iterator.hasNext()){
                Map.Entry entry = (Map.Entry) iterator.next();
                System.out.println(entry.getKey()+"="+entry.getValue());
            }

    输出:

        100=bb
        2=cc
        3=dd
        1=aa

    可以看到1=aa在被访问过后跑到了最后一个。

    这里的LinkedHashMap有三个参数:

        public LinkedHashMap(int initialCapacity,
                             float loadFactor,
                             boolean accessOrder) 

    initialCapacity和loadFactor和hashmap里的一样,分别是初始化容量和装载因子(默认为0.75)。accessOrder为是否按照访问顺序排列,如果是,则被访问的entry将排列到最后一个,默认是false,即按照输入顺序排列。

    LinkedHashMap继承了HashMap并实现了Map接口。所以它具有HashMap的所有特性。并且内部对数据的存储也是数组加链表的形式。但是它多了一个双向链表来维护内部数据的顺序关系。

    Entry的定义

    LikedHaashMap的Entry继承了HashMap的Entry,并且多了Entry<K,V> before, after;,用于双链表的前驱后继节点。

       static class Entry<K,V> extends HashMap.Node<K,V> {
            Entry<K,V> before, after;
            Entry(int hash, K key, V value, Node<K,V> next) {
                super(hash, key, value, next);
            }
        }

    具体的操作就不看了,会用就好。

    关于LinkedHashMap的几个问题

    问  题 答      案
    LinkedHashMap是否允许键值对为空 Key和Value都允许空
    LinkedHashMap是否允许重复数据 Key重复会覆盖、Value允许重复
    LinkedHashMap是否有序 有序
    LinkedHashMap是否线程安全 非线程安全
  • 相关阅读:
    逍遥刘强 - 期货大作手风云录(2015年8月28日)
    雷米 - 心理罪:画像(2015年8月17日)
    雷米 - 心理罪:城市之光(2015年8月11日)
    雷米 - 心理罪:暗河(2015年8月9日)
    雷米 - 心理罪:教化场(2015年8月8日)
    付海棠 - 一个农民的亿万传奇(2015年7月14日)
    阿西莫夫 - 神们自己(2015年6月23日)
    张维为 - 中国震撼:一个”文明型国家“的崛起(2015年5月30日)
    华彬 - 华彬讲透孙子兵法(2015年5月22日)
    股峰求道 - 炼股成金:从散户到操盘手的修炼法则(2015年5月11日)
  • 原文地址:https://www.cnblogs.com/cnsec/p/13286728.html
Copyright © 2020-2023  润新知