hashmap百万级数据存储

狼痴梦 2019-03-20 11:35:27
在Java8中,如何设置初始值的大小?是总数据量除以0.75加1吗?自测:初始大小是总数据量除以100,0.75改成0.5速度会更快些,不懂为什么,求大神指教
...全文
1033 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
狼痴梦 2019-03-26
  • 打赏
  • 举报
回复
引用 3 楼 imiMi_ 的回复:
如果你纠结的是new HashMap<>(initialCapacity)中的initialCapacity如何设定的话,那initialCapacity = 数据量/加载因子 + 1,这个是结合空间和时间成本而做出的折衷的大小,和jdk版本没有任何关系。jdk8的红黑树只是某一个桶冲突过多时链表树化加快读写的一个解决方式。 我不清楚你多大的数据量,如果非常大的话,你的总量除以0.75加1与总量除以100加1其实在初始化map时生成的结构可能是一样的(计算出来的扩容边界threshold是相同的),原因你可以看下map的tableSizeFor(int cap)方法的源码。 关于负载因子的设定也就是关于时间、空间的选择问题,负载因子设定的小,空间利用率低,但大的空间会导致冲突的概率降低了因而提升了读写速度。假如同样的初始值大小, 负载因子小的是比较快的。
谢谢啊,学习了
imiMi_ 2019-03-25
  • 打赏
  • 举报
回复
如果你纠结的是new HashMap<>(initialCapacity)中的initialCapacity如何设定的话,那initialCapacity = 数据量/加载因子 + 1,这个是结合空间和时间成本而做出的折衷的大小,和jdk版本没有任何关系。jdk8的红黑树只是某一个桶冲突过多时链表树化加快读写的一个解决方式。 我不清楚你多大的数据量,如果非常大的话,你的总量除以0.75加1与总量除以100加1其实在初始化map时生成的结构可能是一样的(计算出来的扩容边界threshold是相同的),原因你可以看下map的tableSizeFor(int cap)方法的源码。 关于负载因子的设定也就是关于时间、空间的选择问题,负载因子设定的小,空间利用率低,但大的空间会导致冲突的概率降低了因而提升了读写速度。假如同样的初始值大小, 负载因子小的是比较快的。
狼痴梦 2019-03-22
  • 打赏
  • 举报
回复
jdk8和7是不一样的,7是总量除以0.75加1,这样可以防止扩容,速度更快些,但是8按这个做法是不行的,自己测下来是总量除以100加载因子改成0.5这样速度更快些!是不是8引入了红黑树的原因啊?
  • 打赏
  • 举报
回复
hashmap源码里写的挺清楚的,你可以没事看看源码,看不懂可以看看视频,很多分析hashmap源码的

50,545

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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