直入主题。点击如入HashMap的源码,我们能看到
map也是用数组实现的,只不过数组类型是
,而Entry也实现了Map,而我们实际上总是说的map key对应的其实是Entry的key。
接下来我们来看Entry的属性,我们能看到我们最熟悉的key、value、hash,但是next是什么呢?我们这里先保持下疑问。
接下来我们来看我们最常用的put方法,!
我们可以看出答题可以分四部分。第一,根据hashcode获得hash值;第二,根据hash值获得对应数组的index;第三,遍历对应数组的元素(在这里我们就可以看到Entry.next的作用了,看来Entry保存的是一个链,相同的hash值就可以保存在这个链里),如果找到key对应的值,然后将其替换,返回原来的值;第四,如果没有找到相同的key,就添加一个新的Entry。
接下来我们看addEntry这个方法,
从这个方法里能看出,e记原来的数组元素引用,然后new一个新的Entry将其赋值为数组元素引用,然后可以看出e也是有传入新Entry对象的,这样就可以说通了,e是赋予next的,这样原来的链不会丢失(可以通过第一个元素的next获得),每次添加进一个新都会成为新的header,这模式就是链表的结构了。后面我们还会hashmap根据自己策略进行扩容。
所以总体的来说,hash就是数组和链表的实现。
关于java的HashMap
最新推荐文章于 2025-02-19 21:22:28 发布