总结
HashMap的原理:
HashMap基于Hash算法,通过put(key,value)存储,get(key)来获取。当传入key时,HashMap会根据hash(K key)计算出hash值,根据hash值将value保存在数组里。
当计算出的hash值相同时使用链表或者红黑树来解决Hash冲突,HashMap的做法是用链表和红黑树存储相同hash值的value。当Hash冲突的个数比较少时,使用链表,否则使用红黑树。这样做的好处是,最坏的情况下即所有的key都Hash冲突,采用链表的话查找时间为O(n),而采用红黑树为O(lgn)。
java里面还有一些方法定义了没有实现,不知道会不会在1.9里面加入一些新功能
HashMap的构造
内部的变量
|
三个构造方法
public HashMap(int initialCapacity, float loadFactor) this.loadFactor = loadFactor; this.threshold = tableSizeFor(initialCapacity);//得到的threshold (是一个2的整数次幂-1) >=initialCapacity}public HashMap(int initialCapacity) { this(initialCapacity, DEFAULT_LOAD_FACTOR);}public HashMap() { this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}
HashMap 的存储实现
原理图
hash算法
计算存储到哪一个table下标处
Node节点
链表节点,存储键值对,并含有一个next引用。
红黑树节点
红黑树节点的接口定义来自于LinkedHashMap
put方法实现
|
get 方法实现
get方法比较简单,主要看如果是采用红黑树存储冲突的节点值的时候,怎么查找,这里有很多疑惑,在循环中多次判断hash值得大小,不应该是冲突的元素中的hash值都是一样的码,欢迎一起交流。