说起HashMap,只是知道 K---V对的存储结构,剩下的一无所知。。闲来无事看了看源码,作下记录。(其实是害怕前学后忘,时间可是自己最大的敌人。(- -认真脸))。
JAVA中的最基本的结构也就两种:数组和(c中的指针-->引用),所以HashMap也就酱。
HashMap底层是由数组实现的,但是他数组的每一项又是一个列表,所以就有了“链表散列”,散列表,Hash表等等的叫法。
由此可看出默认是构建了一个负载因子0.75,容量16的HashMap集合。
可以看到里面的Entry[]是一个数组。我们点进去看看。
Map中的key和value,被当成了一个整体来看了,也就是Entry。
他持有一个指向下个元素的引用,所以就有了数组对应的链表结构。
HashMap的存取分析。
我们debug跟一下看看。
所以我们知道了HashMap是通过Entry数组的方式来保存所有的k----v对。当需要存储一个键值对时,先得到该key的hash值,
通过该hash值找到对应数组中的索引(及下标的位置),然后在通过equals方法找到了数组上链表中的存储位置。
当然get也同理。
因此HashMap的存储:
1、对 HahMap 的 Key 调用hashCode()方法,返回 int 值,即对应的 hashCode ;
2、把此hashCode作为哈希表的索引,查找哈希表的相应位置,若当前位置内容为NULL,则把hashMap的 Key、Value 包装成 Entry 数组,放入当前位置;
3、若当前位置内容不为空,则继续查找当前索引处存放的链表,利用equals方法,找到Key相同的Entry数组,则用当前 Value 去替换旧的 Value;
4、若未找到与当前 Key 值相同的对象,则把当前位置的链表后移(Entry数组持有一个指向下一个元素的引用),把新的 Entry 数组放到链表表头;把先加入的放到链尾。
HashMap 的扩容是一倍。初始化大小是 16,扩容因子默认大小是 0.75(当前大小 和 当前容量 的比例超过了 扩容因子,就会扩容,扩容后大小为 一倍)。