共同学习Java源代码-多线程与并发-ConcurrentHashMap(二)

本文详细解析了ConcurrentHashMap中Node类的结构与方法实现,包括构造方法、getter方法、hashCode方法、toString方法、equals方法及find方法。通过具体代码展示了节点如何存储键值对,并在并发场景下保证数据的一致性和安全性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    privatestaticfinal ObjectStreamField[] serialPersistentFields = {

        new ObjectStreamField("segments", Segment[].class),

        new ObjectStreamField("segmentMask", Integer.TYPE),

        new ObjectStreamField("segmentShift", Integer.TYPE)

};

新版本里没实际意义的方法 为了兼容过去版本而存在的

 

staticclass Node<K,V> implementsMap.Entry<K,V> {

节点类 继承自Map接口的Entry内部类

        finalinthash;

    哈希值属性

        final K key;

键属性

        volatile V val;

    值属性

        volatile Node<K,V> next;

下一个节点

 

        Node(inthash, K key, V val, Node<K,V> next) {

            this.hash = hash;

            this.key = key;

            this.val = val;

            this.next = next;

        }

  构造方法为属性挨个赋值

 

        publicfinal K getKey()       { returnkey; }

        publicfinal V getValue()     { returnval; }

getter方法

        publicfinalint hashCode()   { returnkey.hashCode() ^ val.hashCode(); }

  节点的hashCode方法是键的hashCode和值的hashCode进行异或 

      publicfinal String toString(){ returnkey + "=" + val; }

  toString方法

        publicfinal V setValue(V value) {

            thrownew UnsupportedOperationException();

        }

  值的setter方法

 

        publicfinalboolean equals(Object o) {

            Object k, v, u; Map.Entry<?,?> e;

            return ((oinstanceof Map.Entry) &&

                    (k = (e =(Map.Entry<?,?>)o).getKey()) != null &&

                    (v = e.getValue()) !=null &&

                    (k == key || k.equals(key)) &&

                    (v == (u = val) || v.equals(u)));

        }

  equals方法 就是判断键值对都不为空 且键值对要么==返回true 要么equals返回true

 

        Node<K,V> find(inth, Object k) {

            Node<K,V> e = this;

            if (k != null) {

                do {

                    K ek;

                    if (e.hash == h &&

                        ((ek = e.key) == k || (ek != null && k.equals(ek))))

                        returne;

                } while ((e = e.next) != null);

            }

            returnnull;

        }

    }

find方法进入do while循环遍历链表挨个遍历下一个节点判断如果节点的哈希值和参数哈希值相等且参数键和节点的键相等就返回这个节点

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值