1.背景:

hashMap由于使用了hash算法,导致数据结构是无序的,那么有没有有序的map呢,linkedHashMap,treeMap就是有序的;都可以让key保持一定的顺序;

2.大致原理:

维护了一个双向链表,当前后两个节点插入后会让第一次插入的数据指向第二次插入的数据,第二次插入的数据指向第一次插入的数据;于是就在原本的基础上增加了一个双向链表;这个链表存储了节点的顺序;

3.大致的源码

alt

这个类的节点是entry节点继承自hashMap.Node节点,这个节点是一个内部类实现的,所以写成这个样子;此外在此基础上增加了before,after;

以及head。tail这两个成员变量维护了新增的双向链表的头尾节点;

4.数据量比hashMap大,但是功能更多;

5.LinkedHashMap与HashMap的区别:


import java.util.*;

public class LinkeHashMapTest {
    public static void main(String[] args) {
        Map<String,Integer> linkHMap = new LinkedHashMap<String,Integer>();//数据量比较大的时候,hashMap是无序的但是LinkedHashMap是有序的;
        linkHMap.put("a",1);
        linkHMap.put("b",2);
        linkHMap.put("c",3);
        linkHMap.put("d",4);
        linkHMap.put("e",5);
        linkHMap.put("f",6);
        linkHMap.put("g",7);
        linkHMap.put("fg",8);
        linkHMap.put("gh",9);
        //四种比较常用的遍历方式
        Set<String> set = linkHMap.keySet();
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next + " = " + linkHMap.get(next));
        }

        System.out.println("---");

        Set<Map.Entry<String, Integer>> entries = linkHMap.entrySet();
        Iterator<Map.Entry<String, Integer>> iterator1 = entries.iterator();
        while (iterator1.hasNext()){
            Map.Entry<String, Integer> next = iterator1.next();
            System.out.println(next.getKey() + " = " + next.getValue().toString());
        }

        System.out.println("---");
        for (String s : linkHMap.keySet()) {
            System.out.println(s + " = " + linkHMap.get(s));
        }

        System.out.println("---");

        for (Map.Entry<String, Integer> stringIntegerEntry : linkHMap.entrySet()) {
            System.out.println(stringIntegerEntry.getKey() + " = " + stringIntegerEntry.getValue().toString());
        }


    }
}