HashMap与ConcurrentHashMap 的数据结构

HashMap:
数组与链表,每个数据对应一个链表
插入时进行与运算
深入理解HashMap(原理,查找,扩容)_hashmap 存储数据量增大10倍查询时间会变吗-CSDN博客
数组默认长度16,当超过16*0.75=12时,组数长度变为16*2->叫resize,毁
HashMap的基础构造器HashMap(int initialCapacity, float loadFactor)带有两个参数,它们是初始容量initialCapacity和加载因子loadFactor。
Java集合:HashMap源码剖析 - ^_TONY_^ - 博客园
相同含义的两个对象,插入同一个key:
HashMap的key是对象_hashmap的key是一个对象-CSDN博客

为什么是数组长度是16
计算卡槽点时,具体落到哪个数组时,做与运算时
hash(hashCode(key)) & (length-1) -> 会落到位置范围内
二进制:Interger.toBinaryString(15);
是容量到了12会扩容,在扩容的时候更多的节点不需要重新计算到新槽点, hash之后的桶的角标是不变的。

为什么0.75
过低,小一点:扩容频繁。
过高,大一点:扩容不容易发生,数组重复概率增加,导致get和put时间增多,冲突需要遍历大量链表空间。

final int hash(Object key)里有>>>,>>>
降低重复冲突概率

深入理解:[url]https://www.zhihu.com/question/20733617[/url]
“扰动函数”混合原始哈希码的高位和低位,加大低位随机性,为了减少数组碰撞概率,减少10%。
Java 8觉得扰动做一次就够了,做4次的话,多了可能边际效用也不大,所谓为了效率考虑就改成一次了。
当获取对象时get,hash找到数组槽位,循环链表,通过键对象的equals()方法找到正确的键值对,然后返回值对象。

HashTable:
数组默认长度11
HashMap与ConcurrentHashMap的区别_concurrenthashmap与hashmap的区别-CSDN博客
继承的父类不同
线程安全性不同
key和value是否允许null值
hash值不同,插入算法也不同,hashtable取取模运算,hashmap与运算。
是否提供contains方法
http://blog.csdn.net/fujiakai/article/details/51585767

ConcurrentHashMap:
史上最详细的ConcurrentHashMap详解--源码分析_concurrenthashmap 详解-CSDN博客

segment数组,每个数组是一个hashtable,里面有分段锁
多线程put时,当同一数组存储时线程加锁,不同数组时,没有锁,效率的提升。

ConcurrentHashMap 1.8原理 底层用了分段锁 之后做了什么优化

cas+synchronized:并发安全ConcurrentHashMap集合深入学习(持续更新)_concurrenthashmap cas+synchronized-CSDN博客

为什么线程安全的map,key和value不能是null
线程安全的Hashtable, ConcurrentHashMap 的 key和value 为什么不能为null?_concurrenthashmap 不支持 key 或者 value 为 null 的原因?-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值