HashMap什么时候开辟bucket(桶)数组占用内存

Posted 18sui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HashMap什么时候开辟bucket(桶)数组占用内存相关的知识,希望对你有一定的参考价值。


创建hashMap的时候并不会马上开辟数组大小占用内存,而是在第一次put的时候调用resize方法开辟

HashMap

java 中hashmap是以一致性hash算法基础实现的一个map,hash算法就是散列表算法,

hash表的存取都是常数阶。算法本身我就不多说了,我就说说java中的HashMap对象,

它是一个hash表算法实现的,hash表是以bucket元素的一个数组,这个数组的长度必须严格设定,因为它关系到碰撞率

什么是碰撞率那,首先HashMap内维护一个很大的数组,每个数组是一个bucket,bucket中是一个链表,链表中的元素是一个Entry

Entry是一个键值对,包含一个key和一个value,

put(key,value)函数的操作就是通过获得key的hashCode,也就是Object的hashCode函数,这个返回值是一个int值,这个int值并不是直接作为数组的位置,

它要经过一个一元运算, f(x)=ax+b 。这个函数大家都应该清楚,它的定义域就是所有的hashCode值,值域就不一定,它取决于a的大小,如果a大于1它的值域会比定义域还大

但是这根本没有意义,如果小于1值域就会小于定义域,就会有多个定义域的值落在同一个值上,这就是碰撞

就是两个entry获得的位置是同一个位置,显然a越大,碰撞几率越小,想法碰撞几率越大,如果a=1,就不存在的碰撞的可能,因为hashCode本身就是一个唯一值。

对于碰撞时怎么处理的哪,就是将碰撞的对象用一个链表存起来。

当取一个对象时,先根据key获得hashCode计算出这个位置,如果bucket里的entry只有一个,如果entry有多个,就要采用equals函数,比较计算出要获得的对象

以上是关于HashMap什么时候开辟bucket(桶)数组占用内存的主要内容,如果未能解决你的问题,请参考以下文章

HashMap源码注释翻译

bucket sort 桶排序

hashmap会问到数组索引,hash碰撞怎么解决

桶排序

深入解析HashiMap那些不为人知的事儿

HashMap