原理:
本质上是一个数组,数组元素为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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
推荐阅读更多精彩内容
- Github issues:https://github.com/littlejoyo/Blog/issues/ ...
- 前言 对于初级和中级程序员来说,Java的Api是必须迈过的一个“坎”,许多程序员在对业务代码麻木后就会对代码的实...
- 哈希表(hash table)也叫散列表,是一种非常重要的数据结构,应用场景及其丰富,许多缓存技术(比如memca...
- HashMap全方位剖析 常见HashMap面试问答 HashMap是不是有序的? 不是有序的。 有没有有序的Ma...