本文共 874 字,大约阅读时间需要 2 分钟。
HashMap是基于hashing的原理,使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象。
- HashMap是在bucket中储存键对象和值对象,作为Map.Entry。
key计算出一个hashcode,hashcode与“操作”计算出数组下标
在把put进来的key,value封装为一个entry对象
判断数组下标对应的位置,是不是空,如果是空则把entry直接存在该数组位置
如果该下标对应的位置不为空,则需要把entry插入到链表中
并且还需要判断该链表中是否存在相同的key,如果存在,则更新value
如果是JDK7,则使用头插法
如果是JDK8,则遍历链表,并且在遍历链表的过程中,统计当前链表的元素个数,如果超过8个,则先把链表转变为红黑树,并且把元素插入到红黑树中
链表中的元素的个数为8个或超过8个。满足当前数组的长度大于或等于64才会把链表转变为红黑树。
解决链表过长,导致查询和插入效率慢的问题
如果要解决这个问题,也可以通过数组扩容,把链表缩短也可以解决这个问题
在数组长度还不太长的情况,可以先通过数组扩容来解决链表过长的问题。
作者:麦克猫Cat
本文版权归作者和CSDN共有,欢迎交流
转载地址:http://tthg.baihongyu.com/