Map集合在底层使用数据+链表+红黑树作为存储结构,Map中的每一个元素,都会被封装成一个内部类Entry对象,该对象存有key、value、next、hash。Map底层是一个默认长度为16的数组,在数组中保存Entry对象。所以,每次当我们使用下面这行语句时,都会将key、value存储到Entry对象中,然后将每一个Entry对象都保存在数组中,当发生哈希冲突时,会在发生哈希冲突的数组位置将Entry对象以链表的形式保存,并且当链表长度大于阈值8,数组长度大于64时,会将列表转化为红黑树,减少搜索时间。
- Map
map = new HashMap(); - map.put("", "");
下面简单介绍一下,当给Map集合中添加一个键值对元素时,HashMap发生了什么。
⑴判断Node类型的数组table是否为空,如果为空进行初始化。
⑵如果不为空,使用hash方法计算key的hashCode,通过(n-1) & hash计算应当存放在数组中的下标index。
⑶查看table是否存在数据。
⑷如果没有数据,就构造一个Node
⑸如果存在数据,说明发生哈希冲突,继续判断key是否相等。
⑹如果相等,用新的value替换原数据。
⑺如果不相等,判断当前节点类型是不是TreeNode
⑻如果是树型节点,创造树型节点插入到红黑树中。
⑼如果不是树型节点,创建普通Node
⑽判断链表长度大于阈值8并且数组长度大于64,如果满足,链表转换为红黑树,如果不满足,数组扩容。
⑾最后,插入完成后,判断当前节点数是否大于实际存储空间大小。
⑿如果大于,调用resize()方法,按原数组的长度,扩容一倍。