以下内容属于笔记,如有人阅读并发现错误,请不吝指出。
首先先了解下HashMap的实现原理,HashMap使用数组和链表的形式存储数据,这是HashMap的牛X所在。一开始,我只看到HashMap中时Entry[]的形式存储数据,很久以后,但我看到next关键字后才意识到,Entry是个链表结构。
如下代码:
![](https://img.haomeiwen.com/i10057278/b237fd31213b177d.png)
![](https://img.haomeiwen.com/i10057278/137525c66c33b30e.png)
我们知道,当你使用put方法将键值对放入HashMap中时,首先会对key值去hash值确定Entry数组中的位置,如果这个位置上已经有元素存在,就会去遍历该位置上的Entry链表对象,替换或者赋值给Entry。
比如,依次加入如下三个元素:(Aa与BBhashcode值相同)
![](https://img.haomeiwen.com/i10057278/02b8a8ed00359dd9.png)
最后的结果是Entry数组中元素为
![](https://img.haomeiwen.com/i10057278/2cee4cdebca80ead.png)
BB=2222的next指向Aa=2222,Aa=1111被最后一次Aa=2222给更新了
![](https://img.haomeiwen.com/i10057278/bc73de83392cf61e.png)
具体的过程如下:
第一次放入Aa=1111,在Entry数组下标下标为4的地方放入,之后在放入BB=2222时,由于Aa与BB的hashcode相同,得到Entry数组下标也为4,就会在该位置插入BB=2222,并将BB=2222的next指向Aa=1111(执行②中BB的next指向Aa),最后再放入Aa=2222,又是数组下标为4,取该位置的Entry链表,取next,发现为Aa=1111,于是将Aa=1111更新为2222(执行①中for循环进行更新).
网友评论