(惊艳)hashmap的理解(映射)

第一:

 

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吗) , 不是 , 接着下去

 

posted on 2018-01-31 13:11  多情剑客无情剑;  阅读(312)  评论(0编辑  收藏  举报

导航