HashMap的容量到底指的是什么?跪求各大佬解答

AttackCityLion_ 2020-12-22 09:33:00
HashMap 的默认容量是16加载因子是0.75,这个16是指底层数组的容量还是指添加元素的个数,如果是指添加的元素的个数那么底层数组的容量是怎么确定的?具体是什么时候开始扩容,是添加到12个元素就开始扩容还是数组的容量到了0.75开始扩容?
...全文
9813 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
fenda、 2022-11-21
  • 打赏
  • 举报
回复

不是数组,是存储的总键值对,只不过数组的大小要和容量一样(可能会出现每个连上只有一个,均匀分布在所有数组上)

qq_1113502097 2020-12-25
  • 打赏
  • 举报
回复
HashMap的构造方法有很多,而参数最少的构造就会默认容量为16,扩容因子为0.75,当存储的数量大于容量*0.75,也就是12的时候,就会对map进行一次扩容,而hashmap是利用哈希值进行快速计算的,而为了扩容与快速扩容,一般会扩容为2的幂次倍,即16扩容一次后为32,当存储的数量大于32*0.75后会再次进行扩容为64.每次扩容实际上是申请一块新的地址,然后将map拷贝过去,让扩容太频繁就会导致内存抖动问题,增加瞬间的内存消耗和性能消耗,因此在创建HashMap的时候,如果能预知初始的数据量的大小,在构造的时候可以设置初始容量,也可以设置扩容因子。同时,为了方便进行快速扩容,一般设置初始容量因当为2的幂次倍,即假设数据是17,我们应该申请32,数据是1000,我们应当申请1024.至于为什么2,那是因此计算机是二进制,我们在以2进行扩容时,只需要将二进制前面在增加一个就变成原来的两倍了。
kk1924 2020-12-23
  • 打赏
  • 举报
回复
HashMap 的默认容量是16加载因子是0.75,

这个16是指底层数组的容量还是指添加元素的个数,
默认容量16的原意就是实现数组的初始容量;;但不是添加元素的个数(容量可变,具体是根据物理内存来定)


如果是指添加的元素的个数那么底层数组的容量是怎么确定的?

具体物理内存来定;

具体是什么时候开始扩容,是添加到12个元素就开始扩容还是数组的容量到了0.75开始扩容?

0.75是权重或阈值,,就是你上面说的底层数组扩容的阈值
viewgroup 2020-12-22
  • 打赏
  • 举报
回复
引用 楼主 AttackCityLion_ 的回复:
HashMap 的默认容量是16加载因子是0.75,这个16是指底层数组的容量还是指添加元素的个数,如果是指添加的元素的个数那么底层数组的容量是怎么确定的?具体是什么时候开始扩容,是添加到12个元素就开始扩容还是数组的容量到了0.75开始扩容?


容量是一个容器最大存储值,比如一个500ml的水杯,容量就是500ml , hashmap的容量 是根据 DEFAULT_INITIAL_CAPACITY MAXIMUM_CAPACITY 这两个来确定的,也就是说hashmap不是无限大的,是存在最大值的。
什么时候扩容可以通过查看源码来解决的,,put一个元素后,会先判断是否需要扩容,如果需要扩容,就增加一次容量,所以不是16*0.75=12 第一次扩容的,,是put第13个元素的时候,触发扩容的
++modCount;
if (++size > threshold)
resize(); //put 的最后阶段,判断是否扩容 13>12所以扩容 12==12不扩容
afterNodeInsertion(evict);
return null;
KeepSayingNo 2020-12-22
  • 打赏
  • 举报
回复 1
这个16是指底层数组的容量,不是元素的数量,如果真是元素的数量,那HashMap就会频繁扩容
qq_39936465 2020-12-22
  • 打赏
  • 举报
回复
引用 楼主 AttackCityLion_ 的回复:
HashMap 的默认容量是16加载因子是0.75,这个16是指底层数组的容量还是指添加元素的个数,如果是指添加的元素的个数那么底层数组的容量是怎么确定的?具体是什么时候开始扩容,是添加到12个元素就开始扩容还是数组的容量到了0.75开始扩容?
默认容量其实就是最大容量,16是基数,每次扩容都增加16容量。 容量是size的话,最大容量就是maxsize,当size/maxsize 大于等于0.75就开始扩容。

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧