HashMap的实现原理【Z】[转]
?? 从上图中可以看出,?HashMap?底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个?HashMap?的时候,就会初始化一个数组。
?? 源码如下:
?
?? 有了上面存储时的?hash?算法作为基础,理解起来这段代码就很容易了。从上面的源代码中可以看出:从?HashMap?中?get?元素时,首先计算?key?的?hashCode?,找到数组中对应位置的某一元素,然后通过?key?的?equals?方法在对应位置的链表中找到需要的元素。
??
?? 3)?归纳起来简单地说,?HashMap?在底层将?key-value?当成一个整体进行处理,这个整体就是一个?Entry?对象。?HashMap?底层采用一个?Entry[]?数组来保存所有的?key-value?对,当需要存储一个?Entry?对象时,会根据?hash?算法来决定其在数组中的存储位置,在根据equals?方法决定其在该数组位置上的链表中的存储位置;当需要取出一个?Entry?时,也会根据?hash?算法找到其在数组中的存储位置,再根据?equals?方法从该位置上的链表中取出该?Entry?。
?
4.??? HashMap?的?resize?(?rehash?):
???当?HashMap?中的元素越来越多的时候,?hash?冲突的几率也就越来越高,因为数组的长度是固定的。所以为了提高查询的效率,就要对?HashMap?的数组进行扩容,数组扩容这个操作也会出现在?ArrayList?中,这是一个常用的操作,而在?HashMap?数组扩容之后,最消耗性能的点就出现了:原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是?resize?。
???那么?HashMap?什么时候进行扩容呢?当?HashMap?中的元素个数超过数组大小?<span lang