hashmap

原理:
本质上是一个数组,数组元素为entry(即键值对),通过对key值做hash运算获取index,entry还是一个链表结构,当index一样时,新entry从头部插入,因为作者认为后插入的更经常被查询(链表的查询时顺序检查);
数组的长度默认为16,自动扩充和自定义要求是2的幂次方,这是因为hash算法:hashcode(key)&(length-1),保证length为2的幂次方可以让结果趋近hashcode的尾数,而hashcode本身保证了均匀分布。
高并发下产生循环链表:
Hashmap在插入元素过多的时候需要进行Resize,Resize的条件是
HashMap.Size >= Capacity(原数组大小) * LoadFactor(负载因子,默认0.75f)。
Hashmap的Resize包含扩容和ReHash两个步骤,ReHash在并发的情况下可能会形成链表环。
线程安全的结构体concurrentHashMap
相同线程安全的HashTable和collections.synchronizedMap,存在性能问题,因为读写操作会对数组集体加锁
concurrenthashmap采用了segment结构,即二级hash表,只有在同一个segment多线程写操作才会加锁
concurrenthashmap如何保证size()方法呢?
乐观锁,假设计算所有segment大小过程没有插入,计算结束后通过比对segments的修改次数来确认计算是否正确,如果修改次数不一致则重新计算,当超过阈值时转为悲观锁,把所有segment加锁,重新计算size

你可能感兴趣的:(hashmap)