关于HashMap扩容机制的小疑问

luqing414 2016-10-29 11:36:46
HashMap内部初始化一个长度为16的数组,完后每个数组都是一个链表的表头,通过数组的长度取余来决定放到数组哪个位置的链表里,完后,当HashMap中的数据容量超过16*0.75,也就是12时,就直接扩容一倍,也就是数组长度变成32了,我不知道这样理解对不对,如果是这样的话,我有个问题

假设我存储在HashMap中的值大部分都分配到这个长度为16的数组的某一个或两个索引的链表中,比如数组【0】,数组【1】,那其实还有十几个数组的值是空的,数组【2】到数组【15】都是空的,如果是这样,到了HashMap容量为12时,就扩容为16*2,不是太浪费了吗,这个时候大部分存储空间还是空的啊
...全文
531 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
丁金阳 2020-04-20
  • 打赏
  • 举报
回复
引用 5 楼 受八气 的回复:
HashMap添加链表和红黑树的初衷就是是为了解决哈希冲突,哈希冲突当然越少越好。HashMap极力避免键值对只在一两个链表中,想让数据分布的更散列,所以当键值对的数量到达阈值时,就会扩容,一是为了将太长的链表分散,二是为了提供更多的数组空间,减少哈希冲突。如果每个数组下标里只有一个键值对是最好的。至于一楼完全是误人子弟,根本没看懂源码。


人家说的好像是1.7版本
阿田和小夏 2019-07-13
  • 打赏
  • 举报
回复
HashMap添加链表和红黑树的初衷就是是为了解决哈希冲突,哈希冲突当然越少越好。HashMap极力避免键值对只在一两个链表中,想让数据分布的更散列,所以当键值对的数量到达阈值时,就会扩容,一是为了将太长的链表分散,二是为了提供更多的数组空间,减少哈希冲突。如果每个数组下标里只有一个键值对是最好的。至于一楼完全是误人子弟,根本没看懂源码。
_白闹 2019-05-07
  • 打赏
  • 举报
回复
能看看源码之后再在这里评论吗,可以不误人子弟吗?
ps45221 2016-10-31
  • 打赏
  • 举报
回复
引用 1 楼 qq_36427638 的回复:
HashMap默认初始化容量16,意思是可以储存16个链表,默认扩容系数0.75,当有12个链表时才扩容,像你说的这种情况只有两个链表,不扩容,就算这两个链表里有1万个元素也不扩容。另外,初始化容量与扩容系数都能在创建HashMap时设定。
1楼的答案是对的,这种情况是不会扩容的。 但是如果的重复元素过多的话,jdk内部会做优化,把链表变为树形结构。jdk1.8中已经实现了。
bree06 2016-10-29
  • 打赏
  • 举报
回复
是的, HashMap用空间减少元素的碰撞, 浪费空间是明显的. 最好不要用HashMap保存大量的数据. 另外存的操作大于读的操作也不适合
代码禅诗 2016-10-29
  • 打赏
  • 举报
回复
HashMap默认初始化容量16,意思是可以储存16个链表,默认扩容系数0.75,当有12个链表时才扩容,像你说的这种情况只有两个链表,不扩容,就算这两个链表里有1万个元素也不扩容。另外,初始化容量与扩容系数都能在创建HashMap时设定。

62,628

社区成员

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

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