美文网首页Code程序员
Java集合-LinkHashMap

Java集合-LinkHashMap

作者: 懒懒惰惰 | 来源:发表于2017-08-15 09:51 被阅读57次

HashMap实现了一个Hash表为主的数据结构,他将数据根据key的哈希值,存储于一个数组中,通过合理的碰撞,将相同hash值的数据通过链式结构存储。

很显然,这种hash结构存储的数据是无序的,JDK通过继承HashMap实现了集中有序的HashMap数据结构,如链表式的LinkHashMap

首先看,LinkHashMap是继承与HashMap的:

public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

那么这个Link是怎么实现顺序存储的呢?

他通过构造出另一个数据结构Doubly Linked List存储数据顺序,注意,这里他即实现了HashMap原有的数据结构进行数据存储,再实现了另一个Doubly Linked List去存储数据的顺序,这两个数据结构是相互独立,同时存在的。

private transient Entry<K,V> header;

这里的header就是该link的头元素,其中Entry在这里重新进行了定义:

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

他既继承了原有的Entry结构,同时,加入了before, after的双向指针。

那么看一下,header在LinkHashMap初始化时:

void init() {
    header = new Entry<>(-1, null, null, null);
    header.before = header.after = header;
}

header定义了一个空的entry,同时这个entry的hash值为-1(也就是这个entry不会存入HashMap中的hash table中)。同时将entry的双向指针都指向自己。


image

那么,现在看一下,怎么向这个header链表新增一个元素。LinkHashMap继承了put方法,同时重写了createEntry方法:

void createEntry(int hash, K key, V value, int bucketIndex) {
    HashMap.Entry<K,V> old = table[bucketIndex];
    Entry<K,V> e = new Entry<>(hash, key, value, old);
    table[bucketIndex] = e;
    e.addBefore(header);
    size++;
}

其中,加入了e.addBefore(header),这里的addBefore放在在Entry中定义为:

private void addBefore(Entry<K,V> existingEntry) {
    after  = existingEntry;
    before = existingEntry.before;
    before.after = this;
    after.before = this;
}

举例,在header中加入第一个entryA时:


image

那么EntryA加在了Header之前,那么插入第二个元素EntryB时:


image
那么这里就是在entryA和header之间加入一个元素。

上面介绍了如何将一个entry加入到header中,使用的是put方法,同时linkHashMap还提供了在get的方法中修改header顺序的方法,这里就不讲述了。

总结:
==LinkHashMap实际是在HashMap的基础上再实现了一个链表的结构进行存储数据顺序的。==

相关文章

  • Java集合-LinkHashMap

    HashMap实现了一个Hash表为主的数据结构,他将数据根据key的哈希值,存储于一个数组中,通过合理的碰撞,将...

  • 面试总结 - 草稿

    集合,LinkHashMap ArrayList 区别Set Collection collections区别vo...

  • 总结

    #阿里 一面集合,LinkHashMap ArrayList 区别Set Collection collectio...

  • LinkHashMap 源码分析

    LinkHashMap 简介 LinkHashMap 继承自 HashMap 同时也实现了 Map 接口。所以 L...

  • Java HashMap VS LinkHashMap

    最新在梳理Java,顺便分享记录下,供大家参考。从以下几个地方对比阐述两个类的异同。 存储结构 HashMap 说...

  • 一篇文章,全面解读Android面试知识点

    Java Java基础 Java集合框架 Java集合——ArrayList Java集合——LinkedList...

  • 收藏夹

    博文 Java 集合:Java 集合学习指南 Java 集合:Java 集合源码剖析 HashMap:HashMa...

  • Java 集合框架_开篇

    Java 集合框架系列 Java 集合框架_开篇Java 集合框架_ListJava 集合框架_ArrayList...

  • Java 集合框架_List

    Java 集合框架系列 Java 集合框架_开篇Java 集合框架_ListJava 集合框架_ArrayList...

  • 9、java集合

    1、什么是java集合 java集合是用来存储多个数据引用的数据类型。 2、java集合分类 java集合类在ja...

网友评论

    本文标题:Java集合-LinkHashMap

    本文链接:https://www.haomeiwen.com/subject/jormrxtx.html