目录
- 哈希表
- 哈希冲突(Hash Collision)
- JDK1.8的哈希冲突解决方案
- 哈希函数
- 如何生成key的哈希值
- Long和Double的哈希值
- 字符串的哈希值
- 关于31的探讨
- 自定义对象的哈希值
- 自定义对象作为key
- 哈希值的进一步处理:扰动计算
- 装填因子
- TreeMap vs HashMap
- LinkedHashMap
- 关于使用%来计算索引
一 哈希表
-
哈希表也叫做散列表( hash 有
剁碎
的意思) -
它是如何实现高效处理数据的?
- put(“Jack”, 666);
- put(“Rose”, 777);
- put(“Kate”, 888);
作为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是一个我的iOS交流群:413038000,不管你是大牛还是小白都欢迎入驻 ,分享BAT,阿里面试题、面试经验,讨论技术, 大家一起交流学习成长!
以下资料在群文件可自行下载!
- 添加、搜索、删除的流程都是类似的
- 利用哈希函数生成 key 对应的 index
【O(1)】
- 根据 index 操作定位数组元素
【O(1)】
-
哈希表是【空间换时间】的典型应用
-
哈希函数,也叫做散列函数
-
哈希表内部的数组元素,很多地方也叫
Bucket(桶)
,整个数组叫Buckets
或者Bucket Array
二 哈希冲突(Hash Collision)
- 哈希冲突也叫做哈希碰撞
- 2 个不同的 key,经过哈希函数计算出相同的结果
- key1 ≠ key2 ,hash(key1) = hash(key2)
- 解决哈希冲突的常见方法
-
开放定址法(Open Addressing)
✓ 按照一定规则向其他地址探测,直到遇到空桶 -
再哈希法(Re-Hashing)
✓ 设计多个哈希函数 -
链地址法(Separate Chaining)
✓ 比如通过链表将同一index的元素串起来