JDK1.7
构造方法:
1.空参数构造方法 2.双参数构造方法(初始容量,负载因子) 检查参数是否合法 参数赋值 Entry(hash,key,value,next)
put方法:
inittable 创建table,大小为2的整数次幂 计算阈值,容量乘以负载因子 创建数组
处理null key 放在位置0,如果0上没有null key,添加新的entry 添加新entry,modCount++,标识数据有变动,这时操作遍历map会报错concurrentException
取key的hash 方法为取key的hashcode,再进行二次hash,使值更加离散,减少hash碰撞
通过hash值获取数组索引 hash值与数组长度取模
处理put的值 判断hash是否一样并且key==或者equals相同,相同则替换value 不同则进行添加新的entry,modcount++
addEntry实现 先判断扩容,扩容条件:size大于等于阈值且要插入的数组位置不为空,2倍扩容 扩容实现:先判断是否已经最大,最大则不进行扩容,创建新数组,转移数据,计算新的阈值 数据转义将原数组+链表结构的数据以for+while的形式依次取出来从新计算index头插法插入到新的数组和表结构中 插入节点,数组当前位置为null,直接放入,有元素则进行头插法,放在head,其他后移
get方法:
get的key为null 在数组index为0的位置开始循环找key为null的entry,返回value,没有则返回null
get方法 通过key的hash计算数组的index,取出此index下的entry,for循环遍历链表中每一个entry,判断hash相等且key==或equals相等,返回value
JDK1.8
put方法
putVal 数组为空或数组长度为0,进行初始化,resize() resize方法第一次进入,按照初始化的值进行数组创建 通过key的hash计算index 如果数组的index位置为空,newNode,++modcount,判断扩容,条件为元素个数大于阈值 如果数组的index位置不为空,取出entry,如果链表第一个节点刚好就是要替换的。直接替换value,判断条件依然为hash相等并且key==或equals相等 如果第一个节点不是,则判断是不是树结构,是则进行添加树节点方法,不是则遍历链表,存在则替换value,不存在则创建新节点放在链表尾部 树化条件,链表长度大于等8且元素总数大于64
|