HashMap类简介

1 基本定义

数据结构

数据结构 数组 链表 红黑树
用途 存储键值对。数组下标为键的哈希值 解决哈希冲突 解决哈希冲突

定义参数

参数 initialCapacity loadFactor
用途 用于定义数组容量,但数组是延迟初始化的。如果不是2的整数幂,会适当扩大。 负载因子,默认0.75。用于定义扩容阈值threshold\text{threshold} = \text{initialCapacity}' * \text{loadFactor}

基本特性
HashMap中允许null值和null键。null键对应着哈希值0,即数组的下表0。

HashMap是不保证对象的放入顺序的。

基本操作get和`put的时间性能基本为O(1)(如果不考虑哈希冲突的情况下)。


2 基本操作


判断hash/key,key值是否相等,hash值是否相等
判断是否是TreeNode,如果是从根节点二分查找(**问题TreeNode.find的最后的if else)


判断table是否存在
判断节点是否存在
如果是Tree节点,执行RB插入;
如果不是Tree节点,执行链表插入,如果大于TREEIFY_THRESHOLD,则树化。

扩容
计算新容量和新扩容阈值
拷贝

  1. 如果是桶中是单个节点,重新hash到新表中。
  2. 如果是树节点,遍历树切分为低于和高于旧阈值的两个链表,然后进行分别判断是否进行树化。
  3. 如果是链表,遍历树切分为低于和高于旧阈值的两个链表。

树和链表转换
保持节点相对顺序。
使用类和哈希值进行比较。


3 哈希算法

在哈希值随机且扩容阈值为默认值0.75的情况下,哈希表每个桶的频率遵循\lambda=5泊松分布。由于扩容时粒度较大,进而导致泊松分布的方差也很大。如果忽略方差的因素,哈希表桶列表长度为k的概率为e^{-0.5}*\frac{0.5^k}{k!}。第一批值如下:

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
more: less than 1 in ten million

哈希算法

  • 直接寻址法(Identity hash function)
  • 识字分析法
  • 平方取中法
  • 折叠法
  • 随机数法
  • 除留取余法

冲突解决方法

  • 开放定址法(线性探测、二次/平方探测、双散列探测)
  • 拉链法
  • 再哈希
  • 公共溢出区

参考资料

  1. java-hashmap-tail-traversing
  2. Hash function
  3. Consistent hashing
  4. HashMap的死循环
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,640评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,254评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,011评论 0 355
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,755评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,774评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,610评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,352评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,257评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,717评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,894评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,021评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,735评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,354评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,936评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,054评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,224评论 3 371
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,974评论 2 355

推荐阅读更多精彩内容