java.util.concurrent.ConcurrentHashMap源码学习(四)

ConcurrentHashMap中内部类Segment<K,V>的重要方法


重要方法:

a) static final <K,V> Segment<K,V>[] newArray(int i)
创建指定大小的Segment数组。
b) HashEntry<K,V> getFirst(int hash)
得到当前段指定槽位的第一个Entry。
c) V readValueUnderLock(HashEntry<K,V> e)
在加锁的状态下读取指定HashEntry的值。
d) V get(Object key, int hash)
得到指定key和hash码对应的value。先取得对应槽位的第一个Entry,在链表中迭代找到对应key的Entry,最后在加锁的状态下读取value。
e) boolean containsKey(Object key, int hash)
判断当前Segment中是否存在指定key和hash码的Entry。先取得对应槽位的第一个Entry,在链表中迭代找到对应key的Entry。
f) boolean containsValue(Object value)
判断当前Segment中是否存在指定value。循环table中的所有元素,然后到链表中迭代找出value,如果迭代过程中找到的value为会在加锁的情况下再次读出value。
g) boolean replace(K key, int hash, V oldValue, V newValue)
在加锁的状态下替换指定key、hash码和oldValue的元素的值为newValue,替换成功是返回true,否则返回false。
h) V replace(K key, int hash, V newValue)
在加锁的状态下替换指定key和hash码的元素的值为newValue,替换成功是返回true,否则返回false。
i) V put(K key, int hash, V value, boolean onlyIfAbsent)
在加锁的状态下插入指定的key、hash码、value。插入前会确认当前容量,如果超过阈值会调整table的大小。其中onlyIfAbsent为false时才替换已存在的值。
j) void rehash()
调整table的大小。调整后需要重新组织每个链表中的元素,如果原来的槽位上只有一个节点就直接把这个链表移到新的槽位;如果有多个节点,先把链表末端的节点移到新的槽位,然后把其余的节点克隆到新的槽位。旧的table的元素没有置空,交给垃圾收集机制去处理。
k) V remove(Object key, int hash, Object value)
删除一个节点,当value为null是只按key查找节点,反之按key和value查找节点。被删除节点下面的节点保持不变,前面的所有节点要重新生成(克隆)。
l) void clear()
在加锁的状态下,数组table的所有元素置null,同时设置count值为0。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值