第一:
hashmap在内存中是长这样的,数组+链表的形式
// HashMap采用链表法解决冲突,每一个Entry本质上是一个单向链表 transient Entry[] table;
第二: put方法
当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾
找到了数组下标为15的位置,如果没有元素的话,就可以把[key,value]捆绑在一起的键值对(“key-value”插入)
放入进去,引用别人话::map中存储的是键值对
可以看到每一个数据对象是由(hash值,key,value,next)四个属性组成的
如果有对象的话,将这个对象插入到链表的头部
从映射的角度看,多个key可以映射到同一个数组下标中去,所以查找的时候不能一一映射,一个下标可能对应几个数据对象{hash,key,value,next}
第三:get方法
从hashmap中get元素时,首先计算key的hashcode,找到数组中对应下标
如果没元素查找失败
如果有元素的话,然后对这个链表做线性查找,
然后通过key的equals方法在对应位置的链表中找到需要的元素。
判断第一个存在的节点的key是否和查询的key相等。如果相等,直接返回该节点。
比如 {"name","lcy"} -> {"age,25"} 这个键值对是这么排列的,只传递进来key的数据是“age”
然后age.equals(第一个key,name吗) , 不是 , 接着下去