大师网-带你快速走向大师之路 解决你在学习过程中的疑惑,带你快速进入大师之门。节省时间,提升效率

探寻hashmap

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并发集合类代替