探寻hashmap

88次阅读

共计 685 个字符,预计需要花费 2 分钟才能阅读完成。

Hashmap 源码
1、构造器:
a) 获得默认数组大小:1>>4:16
b) 获得负载因子:0.75:衡量 hashmap 的空间使用程度
i. 过大:使用空间更加充分,但是查找效率变低,即时间复杂度变大

ii. 过小:hashmap 数据过于稀疏,造成空间浪费,即空间复杂度变大

c) 创建数组
2、Put()方法:使用 key 的 hash 算法,计算出可 key 的存储的数组位置,确定 key 的位置后相应的 value 也会确定,如果数组位置已经有数值存在,则以第一个值为链头以链表形式存储。
3、Get()方法:计算出 key 的 hashcode 值,然后去寻找
4、Resize()方法:如果需要的存放的存储空间大于默认数组大小 * 负载因子的乘积,那么就发生扩容,扩大为原来的两倍
5、问题:
a) 为什么 hashmap 的容量总是 2 的次方
i. 因为 hashmap 中有一个方法是 h &table.length-1, 这样可以减少碰撞概率。

ii. 例子:8&14 9&14 与 8&15 9&15 15 不会发生碰撞 14 会发生碰撞,这是一会我数学概率问题。

b) 可以的话建议使用 hashmap 的 clear 方法循环使用 hashmap
i. 应为 hashmap 是强引用类型,原有不适使用的 hashmap 不会被 jvm 回收,可能造成内存泄露

高并发的 hashmap
1、情况(1.7):内部链表遭到破坏,发生链表成环,造成死循环,cpu 飙升
2、解决:1.8 引入两个指针声明 确保顺序
确保 hashmap 线程安全
1、方法
a) 使用 collections.synchronizedmap 方法
b) 使用 concurrenthashmap 并发集合类代替

正文完
 0