本文已参与「新人创作礼」活动,一起开启掘金创作之路。
- java7及以前:
get()方法
首先判断输入的key是否为空,如果为空,从hashmap数组下标为0的位置获取值返回。如果不为空,根据key的值,从hashmap数组中获取对应的entry对象,判断这个对象是否为空,为空返回null,不为空返回对应的value值。注意:获取value的方法中key为空和不为空时的方法里都先判断数组中的元素是否为0 ,如果不为0,才继续查找
put()方法
调用put方法的时候首先判断hashmap数组是否为空数组,如果为空,进行初始化,判断key的值是否是null,如果是null,把对应的value值存进数组中下标为0的位置,如果不是是null,计算key的hash值,并计算出下标,遍历下标对应的链表,匹配hash值和key的值,如果存在,则覆盖,返回旧值,如果不存在,新添加一个,返回null 最后判断数组大小,是否扩容
- java8
get()方法
对输入的key的值计算hash值,
首先判断hashmap中的数组是否为空和数组的长度是否为0,如果为空和为0,则直接返回null
如果不为空和0,计算key对应的数组下标,判断对应位置上的第一个node是否满足条件,如果满足条件,直接返回
如果不满足条件,判断当前node是否是最后一个,如果是,说明不存在key,则返回null
如果不是最后一个,判断是否是红黑树,如果是红黑树,则使用红黑树的方式获取对应的key,
如果不是红黑树,遍历链表是否有满足条件的,如果有,直接返回,否则返回null
put()方法
首先计算key的hash值,获取hashmap中的数组和数组长度,如果数组为空,初始化计算key的下标
数组对应下标的位置是否为空,如果为空,则先添加一个,放在这个下标位置,然后判断数组内元素是否大于阈值,如果大于,则进行扩容
如果数组对应下标不为空,则先获取对应链表的第一个值,判断hash和key是否相同,如果相同,新value替换旧value,返回旧value
如果第一个值key不相同,判断当前链表是否是红黑树,如果是红黑树,调用红黑树链表put的方法
如果也不是红黑树,遍历链表,判断当前node是否是最后一个,如果是,说明链表中没有新添加的key,则在最后面新添加一个,然后判断是否超过阈值(8-1),如果超过,则转换成红黑树
如果不是最后一个,说明在中间已经存在key了, 把新值赋值给旧值,并返回旧值,判断是否需要扩容.
注:哈希碰撞:当两个不同的键对象的hashcode相同时,它们会储存在同一个bucket位置的链表中。键对象的equals()方法用来找到键值对。