简介
HashMap采用key/value存储结构,每个key对应唯一的value,查询和修改的速度都很快,能达到O(1)的平均时间复杂度。它是非线程安全的,且不保证元素存储的顺序;
继承体系
![12faa1fea4331af5155299fba1929603.png](https://i-blog.csdnimg.cn/blog_migrate/5e9275c1f4853b70176e62e10cf2e577.jpeg)
HashMap实现了Cloneable,可以被克隆。
HashMap实现了Serializable,可以被序列化。
HashMap继承自AbstractMap,实现了Map接口,具有Map的所有功能。
存储结构
![215b86b2bb76a250a8284fb1fc25df46.png](https://i-blog.csdnimg.cn/blog_migrate/9b9b347fc821f0e69f22e030f2a44707.jpeg)
在Java中,HashMap的实现采用了(数组 + 链表 + 红黑树)的复杂结构,数组的一个元素又称作桶。
在添加元素时,会根据hash值算出元素在数组中的位置,如果该位置没有元素,则直接把元素放置在此处,如果该位置有元素了,则把元素以链表的形式放置在链表的尾部。
当一个链表的元素个数达到一定的数量(且数组的长度达到一定的长度)后,则把链表转化为红黑树,从而提高效率。
数组的查询效率为O(1),链表的查询效率是O(k),红黑树的查询效率是O(log k),k为桶中的元素个数,所以当元素数量非常多的时候,转化为红黑树能极大地提高效率。
源码解析
属性
/** * 默认的初始容量为16 */static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;/** * 最大的容量为2的30次方 */static final int MAXIMUM_CAPACITY = 1 << 30;/** * 默认的装载因子 */static final float DEFAULT_LOAD_FACTOR = 0.75f;/** * 当一个桶中的元素个数大于等于8时进行树化 */static final int TREEIFY_THRESHOLD = 8;/** * 当一个桶中的元素个数小于等于6时把树转化为链表 */static final int UNTREEIFY_THRESHOLD = 6;/** * 当桶的个数达到64的时候才进行树化 */static final int MIN_TREEIFY_CAPACITY = 64;/** * 数组,又叫作桶(bucket) */transient Node[] table;/** * 作为entrySet()的缓存 */transient Set> entrySet;/** * 元素的数量 */transient int size;/** * 修改