博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap
阅读量:5314 次
发布时间:2019-06-14

本文共 932 字,大约阅读时间需要 3 分钟。

HashMap

1. 哈希表的存储过程

  1. 根据key计算出哈希值h.
  2. 假设箱子个数为n,那么键值对应该放在第h%n个箱子中
  3. 如果箱子中有了键值对,应该解决冲突

2. 解决hash冲突

在使用链表解决冲突时,属于同一个箱子的所有键值对都会排列在链表中。

哈希表还有一个重要的属性: 负载因子(load factor),它用来衡量哈希表的 空/满 程度,一定程度上也可以体现查询的效率,计算公式为:

负载因子 = 总键值对数 / 箱子个数

负载因子越大,越容易导致冲突,性能也就越低。当负载因子大于某个常数(1,0.75)时,哈希表将自动扩容。理想状态下哈希表的每个箱子中,元素的数量遵循泊松分布:

泊松分布
当负载因子为 0.75 时,上述公式中 λ 约等于 0.5,因此箱子中元素个数和概率的关系如下:

数量 概率
0 0.60653066
1 0.30326533
2 0.07581633
3 0.01263606
4 0.00157952
5 0.00015795
6 0.00001316
7 0.00000094
8 0.00000006

所以,java8中,在一个箱子的数量大于8时,将链表转成红黑树,小于6时红黑树转成链表。一定程度上解决hash有问题导致一个箱子数量过大导致的而性能问题。

3. 扩容

HashMap,在元素个数大于 容量* 负载因子时,会进行扩容,默认情况下为16*0.75=12

final V putVal(int hash, K key, V value, boolean onlyIfAbsent,               boolean evict) {    .......    // 这时候开始扩容    if (++size > threshold)        resize();    afterNodeInsertion(evict);    return null;}

默认2倍扩容,并做rehash,就算hashcode 不做任何改变,rehash之后对应的箱子也是有可能不同的。对n取模后的值有变化。

转载于:https://www.cnblogs.com/dragonfei/p/8779773.html

你可能感兴趣的文章
基础学习:C#中float的取值范围和精度
查看>>
MongoDB-CRUD
查看>>
javaagent 简介
查看>>
python升级安装后的yum的修复
查看>>
Vim配置Node.js开发工具
查看>>
web前端面试题2017
查看>>
ELMAH——可插拔错误日志工具
查看>>
MySQL学习笔记(四)
查看>>
【Crash Course Psychology】2. Research & Experimentation笔记
查看>>
两数和
查看>>
移动设备和SharePoint 2013 - 第3部分:推送通知
查看>>
SOPC Builder中SystemID
查看>>
MySQL数据库备份工具mysqldump的使用(转)
查看>>
NTP服务器配置
查看>>
【转】OO无双的blocking/non-blocking执行时刻
查看>>
ul li剧中对齐
查看>>
关于 linux 的 limit 的设置
查看>>
HDU(4528),BFS,2013腾讯编程马拉松初赛第五场(3月25日)
查看>>
vim中文帮助教程
查看>>
MySQL基础3
查看>>