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

猜你喜欢

转载自blog.csdn.net/qq18938308968/article/details/85124994
今日推荐