HashMap源码 8

上篇文章分析了keySet内部类,然后发现Values和EntrySet的原理是差不多的,下面就对一下比较不一样的方法进行分析
  1. EntrySet的contains()方法:
    用于判断Map内是否包含某节点,返回boolean类型,
    必须key和value都和Map中的某个节点K,V相同,才返回true

    public final boolean contains(Object o) {
                if (!(o instanceof Map.Entry))    // 判断参数是否为Map节点
                    return false;
                Map.Entry<?,?> e = (Map.Entry<?,?>) o;
                Object key = e.getKey();    // 获取节点key
                Node<K,V> candidate = getNode(hash(key), key);    // 遍历链表获取节点
                return candidate != null && candidate.equals(e);    // 节点不为null,并且和参数相等,返回true
            }
  2. getOrDefault()方法:
    传入key和默认的value,如果Map中key节点的值为空,则返回defaultValue,否则返回key节点的value值
    public V getOrDefault(Object key, V defaultValue) {
            Node<K,V> e;
            return (e = getNode(hash(key), key)) == null ? defaultValue : e.value;
        }
    putIfAbsent
  3. putIfAbsent()方法:
    方法重写于Map接口,当查找到的key节点的value值为null时,覆盖value值,否则不进行覆盖,
    当value初始值不为null的时候,putIfAbsent()保证返回值始终是唯一的,并且是多线程安全的,
    区别于put()方法,put()方法会覆盖旧值

    public V putIfAbsent(K key, V value) {
            return putVal(hash(key), key, value, true, true);    // 第三个参数onlyIfAbsent用于控制是否覆盖旧值, put()方法的onlyIfAbsent为false
        }

  4. remove(Object key, Object value)方法:
    删除Map中key和value都和参数相同的节点
  5. replace()方法:
    指定的key已存在,并且value和oldvalue相等,就用新值(newValue)覆盖旧值,并返回true,
    指定的key不存在,就返回false

    public boolean replace(K key, V oldValue, V newValue) {
            Node<K,V> e; V v;
            if ((e = getNode(hash(key), key)) != null &&    // 查找key,并判断value是否等于oldValue,是则用newValue覆盖,并返回true,否则返回false
                ((v = e.value) == oldValue || (v != null && v.equals(oldValue)))) {
                e.value = newValue;    // 覆盖旧值
                afterNodeAccess(e);
                return true;
            }
            return false;
        }

    指定的key已经存,就用新制覆盖旧值,在指定的key不存在时,方法返回null
    public V replace(K key, V value) {
            Node<K,V> e;
            if ((e = getNode(hash(key), key)) != null) {    // 获取key节点,覆盖旧值并返回旧值,否则返回null
                V oldValue = e.value;
                e.value = value;
                afterNodeAccess(e);
                return oldValue;
            }
            return null;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值