深入理解 Java HashMap 及对应面试题
特别说明
当前文章内容迁移中,如有问题,请提交 issues 谢谢 ~~
HashMap 非线程安全的类。
线程安全的类:
HashTable
,ConcurrentHashMap
,Collections.synchronizedMap
Hash 冲突解决方案
- 链地址法
- Rehash
- 公共溢出区
- 线性探测法:hash(key) 冲突 则查看 hash(key) +n /mod 是否有冲突。
1. 为什么不用 hash
进行分布式存储
一致性 hash 存在什么问题,数据倾斜如何处理。
为什么扩容的时候是 2 的冥次方
- h&(n-1) 增大随机性,提高数组的利用率
- 扩容的时候,移动数据的时候更加方便
rehash时的取余操作,hash % length == hash & (length - 1)这个关系只有在length等于二的幂次方时成立,位运算能比%高效得多。
扰动函数
get 方法如何确定key在数组中的位置,先通过 hash(key) 再通过 tab[(n-1) & hash] 来确定位置。
- 混合高位来增大随机性 hash(key)。
- 尽量保证数据落在不同的地方,均匀分布在不同的位置。