探寻hashmap

Hashmap源码

一、 构造器:算法

  a)得到默认数组大小:1>>4 :16数组

  b) 得到负载因子:0.75:衡量hashmap的空间使用程度安全

i.过大:使用空间更加充分,可是查找效率变低,即时间复杂度变大

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

  c)建立数组并发

二、 Put()方法:使用key的hash算法,计算出可key的存储的数组位置,肯定key的位置后相应的value也会肯定,若是数组位置已经有数值存在,则以第一个值为链头以链表形式存储。jvm

三、 Get()方法:计算出key的hashcode值,而后去寻找高并发

四、 Resize()方法:若是须要的存放的存储空间大于默认数组大小*负载因子的乘积,那么就发生扩容,扩大为原来的两倍线程

五、 问题:指针

  a)为何hashmap的容量老是2的次方code

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.7):内部链表遭到破坏,发生链表成环,形成死循环,cpu飙升

二、 解决:1.8 引入两个指针声明 确保顺序

确保hashmap线程安全

一、 方法

  a)使用collections.synchronizedmap方法

  b) 使用concurrenthashmap并发集合类代替

相关文章
相关标签/搜索