原理:
本质上是一个数组,数组元素为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...