Map中 putIfAbsent、compute、computeIfAbsent、computeIfPresent 学习笔记

Map中 putIfAbsent、compute、computeIfAbsent、computeIfPresent 学习笔记

putIfAbsent
public class Main {
    public static void main(String[] args) {
        HashMap<String, String> map = new HashMap<>();
        map.put("KeyOne", "ValueOne");
        map.put("KeyTwo", null);
        map.put("KeyThree", "ValueThree");

        // Test putIfAbsent
        // put 方法是当 Key 存在时,替换旧的 Value,返回旧的 Value;
        // putIfAbsent 方法是当 Key 存在时,不进行替换除非 Value 为 null,返回旧的 Value;
        // 当 Key 不存在时, 与 put 方法无区别,将键值对存入 Map 中,返回 null
        String s1 = map.putIfAbsent("KeyOne", "NewValueOne");
        String s2 = map.putIfAbsent("KeyTwo", "NewValueTwo");
        String s3 = map.putIfAbsent("KeyFour", "ValueFour");
        System.out.println("当 Key 存在,且 Value 不为 null:" + s1);
        System.out.println("当 Key 存在,且 Value 为 null:" + s2);
        System.out.println("当 Key 不存在:" + s3);
        System.out.println(map);
    }
}

putIfAbsent:当 Key 存在且 Value 为 null 时,Value会被改变
在这里插入图片描述

	// HashMap 中重写 Map 接口中的default方法 putIfAbsent
	// putVal(hash(key), key, value, true, true) 中倒数第二个参数为 onlyIfAbsent
	@Override
    public V putIfAbsent(K key, V value) {
        return putVal(hash(key), key, value, true, true);
    }
	// put 方法中 onlyIfAbsent 参数为 false
	public V put(K key, V value) {
        return putVal(hash(key), key, value, false, true);
    }

putVal 方法源码:在 onlyIfAbsent 为 false 或者 oldValue 为 null 时替换旧的 Value
在这里插入图片描述

compute
public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();

        map.put("KeyOne", 1);
        
		// 不管 Key 存在与否,操作完成后存入 map 中
        Integer exist = map.compute("KeyOne", (k, v) -> v + 1);
        Integer notExist = map.compute("KeyTwo", (k, v) -> {
            if(v == null) return 0;
            return v + 1;
        });

        System.out.println(exist);
        System.out.println(notExist);
        System.out.println(map);
    }
}

在这里插入图片描述

computeIfAbsent
public class Main {
    public static void main(String[] args) {
        HashMap<String, List<String>> map = new HashMap<>();
		
		map.put("KeyOne", null);
		
        // Test computeIfAbsent
        // 如果 Key 没有映射到一个值或者映射到 null,调用 mappingFunction ,
        // 并在 mappingFunction 执行结果不为 null 时,与 Key 关联放入 map
        map.computeIfAbsent("KeyOne", k -> new ArrayList<>());
		
        // 以前得这么写 👇
        // 注意:不是if(!map.containsKey("KeyOne"))
        // if(map.get("KeyOne") == null){
        //     map.put("KeyOne", new ArrayList<>());
        // }
        
        System.out.println(map);
    }
}
computeIfPresent
public class Main {
    public static void main(String[] args) {
        HashMap<String, Integer> map = new HashMap<>();

        map.put("KeyOne", 1);
        
		// 对 map 中已经存在的 Key 的 Value 操作
        map.computeIfPresent("KeyOne", (k, v) -> v + 1);

        System.out.println(map);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值