HashMap 底层数据结构
HashMap基于Map接口实现(Map:特殊集合,是一个个key-value键值对)。key可以允许为null,但只能是一个,且key不能重复(新值覆盖旧值)。
底层采用Entry数组(Entry:Map中的一个静态内部类,key,value,next三个重要属性,next用来解决当key的hash值相同但equals不同)和链表实现(链表散列),若桶中链表元素个数大于等于8时,链表转换成红黑树结构。
HashMap 源码解析
添加元素
- 判断 table == EMPTY_TABLE 。table为空,初始化一个Entry数组。HashMap的数据都存放在Entry[]中(单链表)。
PS:HashMap是一个线性的Entry数组,在Entry这个对象中存key和value。 - 循环遍历数组,判断key是否为null,如果有null,则新值覆盖旧值。有,则hash值为0,数据存储在这个数组0的位置,table[0]。
- 通过hash方法对key进行计算hash散列值,根据散列值查找值要保存在table中的位置。
- 循环遍历Entry数组,判断有无重复元素。判断2个Entry对象的key的hash是否相同(仅表示存储位置)。继续判断key或equals是否相等。都满足,表示要添加的元素key已重复,新值覆盖旧值,return返回。条件不满足,直接添加到Entry对象中。
查找元素
计算key的value值,找到数组中的对应位置元素,然后key的equals方法在对应的位置的链表找到元素。
HashMap 容量
存储大容量数据,最好预先指定size大小为2的整数次幂次方。使数据在数组上分布均匀,碰撞几率小,查询效率高(默认初始化大小为16)。
扩容resize()
,数组扩大,重新计算每个元素在数组中的位置,极大消耗性能,需要提前预设元素个数。