详解HashMap数据结构实现

  HashMap的设计是由数组加链表的符合数据结构,在这里用自己的语言以及结合源码去总结一下,如果有不对的地方希望评论指正,先拱手谢谢。

  HashMap是日常中非常常用的一种数据结构,我们要想深入了解学习任何一门技术,都是要先应用,再深入。深入就要了解实现的原理,在java语言中,最基本的结构是数组以及类变量(引用),HashMap是两者的结合,更明确的说,HashMap是数组以及链表的结合。

public class HashMap<K, V>
  extends AbstractMap<K, V>
  implements Map<K, V>, Cloneable, Serializable
{
  private static final long serialVersionUID = 362498820763181265L;
  static final int DEFAULT_INITIAL_CAPACITY = 16;
  static final int MAXIMUM_CAPACITY = 1073741824;
  static final float DEFAULT_LOAD_FACTOR = 0.75F;
  static final int TREEIFY_THRESHOLD = 8;
  static final int UNTREEIFY_THRESHOLD = 6;
  static final int MIN_TREEIFY_CAPACITY = 64;
  transient Node<K, V>[] table;
  transient Set<Map.Entry<K, V>> entrySet;
  transient int size;
  transient int modCount;
  int threshold;
  final float loadFactor;
...
}

  我们可以看到HashMap维护了一个Node<K,V>数组,在这里我们再看Node的实现

 static class Node<K, V>
    implements Map.Entry<K, V>
  {
    final int hash;
    final K key;
    V value;
    Node<K, V> next;
.....
}

Node维护了四个属性,Key,Value,Hash码,以及关键的:Node<K,V> next,每一个Node持有下一个Node,形成了链表。

  在这里奉上一张HashMap的导图,当我们插入一个值时,即插入了一个Node,通过Node的key的hashcode与Node<K,V> table 数组的长度来计算出这个Node在数组中的位置,也就是下标。计算的方法就是hash算法,当我们插入一个Node的时候,Key是唯一的,但是不同的key求出的hashcode

posted on 2017-05-13 19:44  落叶如秋  阅读(232)  评论(0编辑  收藏  举报

导航