Hashmap数组问题及put方法

HashMap(数组+链表+红黑树):jdk1.7HashMap 里面是一个数组,然后数组中每个元素是一个单向链表。每个实体是嵌套类 Entry 的实例,Entry 包含四个属性: key,valuehash 值和用于单向链表的 next。1.capacity:当前数组容量,始终保持 2^n,可以扩容扩容后数组大小为当前的 2 倍。2.loadFactor:负载因子,默认为 0.75。3.threshold:扩容的阈值,等于 当前容量乘负载因子(capacity*loadFactor),在 Java8 中,当链表中的元素超过了 8个以后,会将链表转换为红黑树,不变红黑树时间复杂度为 O(n),变红黑树降低时间复杂度为 O(logN)
·ConcurrentHashMap和HashMap思路是差不多,但它支持并发操作,整个ConcurrentHashMap 由一个个 Segment 组成,称为分段锁。它是一个 Segment 数组,Segment 通过继承 ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一个segment,这样只要保证每个 Segment 是线程安全的,也就实现了全局的线程安全。并行度(默认16)有16个 Segments,这个值可以在初始化的时候设置为其他值,但是一旦初始化以后,它是不可以扩容。Segment内部像HashMap

1、先判断数组是否为空,为空进行resize扩容。2、以hash索引数组的长度-1与key的hash值进行与运算,得出在数组中的索引,如果索引指定的位置为空,则代表可以插入,直接插入一个新的node。3、判断当前的key是否存在,如果存在则进行替换,如果替换成功则返回老的值。4、如果key不存在,则判断当前节点是否为树类型,是树,则按照树的操作去追加。5、如果不是树,是链表,就进入循环处理逻辑。6、先判断下一个节点是否为空,如果为空就将新节点放入。7、放入后判断当前链表是否超过长度8,如果超过则转为红黑树。8、如果map的索引表为空或者当前索引表长度还小于64(最大转红黑树的索引数组表长度),那么进行resize操作就行了;否则,如果被碰撞节点不为空,那么就顺着被碰撞节点这条树往后新增该节点插入

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值