一、原型及简介
原型:public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
简介:HashMap基于散列表实现的一个key-value数据结构,能够实现通过key值快速查找。HashMap继承自AbstractMap抽闲类,实现了Map接口。
二、数据结构原理介绍
如下图所示,HashMap是利用数组与链表结合的形式构建的。竖列为数组结构,默认初始数量为16(1<<4)个,横列为链表结构用于解决散列冲突的问题。当数组中有值得元素超过了装载因子的比例(默认为0.75)时,会引发扩容的操作。此操作是为了避免元素过满时引起的链表长度过长,从而影响查找性能。
上图为jdk1.7之前的实现,jdk1.8实现方法是当某一个桶中的元素个数超过了8时,将此桶中的链表构建成红黑树。
三、常用源码解析
1、常量说明
1 /** 2 * 默认初始容量 3 */ 4 static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16 5 6 /** 7 * 最大元素数量 8 */ 9 static final int MAXIMUM_CAPACITY = 1 << 30; 10 11 /** 12 * 默认装载因子 13 */ 14 static final float DEFAULT_LOAD_FACTOR = 0.75f; 15 16 /** 17 * 当一个桶中的元素的数量大于8时,该链表结构可能被转化成一棵红黑树,优化查找 18 */ 19 static final int TREEIFY_THRESHOLD = 8; 20 21 /** 22 * 当一个桶中的元素的数量小于6时,该树结构被转化成链表。 23 */ 24 static final int UNTREEIFY_THRESHOLD = 6; 25 26 /** 27 * 桶被树化的另一个条件是,当hashmap中元素个数大于4 * MIN_TREEIFY_CAPACITY 。避免调整大小和treei阈值之间的冲突。 28 */ 29 static final int MIN_TREEIFY_CAPACITY = 64;