map中的几个新方法

map中的几个常用的方法和区别:

作为对比,先列出来已经存在的方法。

put、putIfAbsent、compute、computeIfAbsent和computeIfPresent方法

对于一个map来说,是有key-value组成的。对map的操作更多的是放在的是对key的处理,上面的操作同样也是如此。更加注重的是key。
如果key存在,那么应该怎么样来进行操作;如果key不存在,那么又该进行怎样的操作。

put返回旧值,如果没有则返回null。在进行put操作的时候,如果key是存在的,那么返回的是旧的值;如果key是不存在的,那么就将key和value添加进去。

    @Test
    public void testMap() {
        Map<String, String> map = new HashMap<>();
        map.put("a","A");
        map.put("b","B");
        String v = map.put("b","v"); // 输出 B
        System.out.println(v);
        String v1 = map.put("c","v");
        System.out.println(v1); // 输出:NULL
    }

compute:返回新值
当key不存在时,执行value计算方法,计算value;和put方法及其相似,这里的方法是如果key是存在的,那么返回的将会是新的值;如果key是不存在的,那么将添加进去的值进行返回;

    @Test
    public void testMap() {
        Map<String, String> map = new HashMap<>();
        map.put("a", "A");
        map.put("b", "B");
        String val = map.compute("b", (k, v) -> "v"); // 输出 v
        System.out.println(val);
        String v1 = map.compute("c", (k, v) -> "v"); // 输出 v
        System.out.println(v1);
    }

putIfAbsent返回旧值,如果没有则返回null
先计算value,再判断key是否存在

    @Test
    public void testMap() {
        Map<String, String> map = new HashMap<>();
        map.put("a","A");
        map.put("b","B");
        String v = map.putIfAbsent("b","v");  // 输出 B
        System.out.println(v);
        String v1 = map.putIfAbsent("c","v");  // 输出 null
        System.out.println(v1);
    }

computeIfAbsent:存在时返回存在的值,不存在时返回新值
参数为:key,value计算方法
当key不存在时,执行value计算方法,计算value

    @Test
    public void testMap() {
        Map<String, String> map = new HashMap<>();
        map.put("a","A");
        map.put("b","B");
        String v = map.computeIfAbsent("b",k->"v");  // 输出 B
        System.out.println(v);
        String v1 = map.computeIfAbsent("c",k->"v"); // 输出 v
        System.out.println(v1);
    }


putIfAbsent 的重点不在于返回值, 而在于如果 key 不为空, 就不插入新值了

再次进行测试:

/**
 * 2021年8月24日01:15:45
 * 用来测试put、compute、computeIfAbsent和putIfAbsent的使用和区别
 */
public class MapTest {

    public static void main(String[] args) {
        dempPutIfAbsent();
    }

    /**
     * 如果说map是没有key的,那么将会把key-value添加进去;如果没有,那么将不会添加进去
     * 再次使用get方法来进行测试
     */
    private static void dempPutIfAbsent() {
        HashMap<String,String> map = new HashMap<>();
        map.put("1","1");
        String s = map.computeIfAbsent("1", k -> "2");
        System.out.println("返回的是:"+s);
        String s1 = map.get("1");
        System.out.println("map中的值是:"+s1);
    }

    /**
     * 如果key是存在的,那么当前的就不会再次去添加了
     * 如果key是不存在的,那么在添加的时候,返回的就是之前不存在的值。这里存在着两种情况:如果map中有一个key映射的值是null;另外一种情况就是key是没有的,但是新添加进去了
     */
    private static void demoPutIfabsent() {
        HashMap<String,String> map = new HashMap<>();
        map.put("1","1");
        String a = map.putIfAbsent("1", "a");
        System.out.println("返回的值是:"+a);
        String b = map.putIfAbsent("2", "a");
        System.out.println("返回的值是:"+b);
        String c = map.putIfAbsent("2", "c");
        System.out.println("返回的值是:"+c);
        String s = map.get("3");
        System.out.println("3对应的value是:"+s);
    }

    /**
     * 可以看到,不管key是否是存在的,在进行添加的时候,返回的都是新的value值
     */
    private static void demoCompute() {
        HashMap<String,String> map = new HashMap<>();
        map.put("1","1");
        String compute = map.compute("1", (k, v) -> "a");
        System.out.println("添加进去后的返回值是:"+compute);
        compute = map.compute("1", (k, v) -> "b");
        System.out.println("添加进去后的返回值是:"+compute);
    }

    /**
     * 在使用put方法的时候,如果key是不存在的,那么put进去之后,返回值是null
     * 如果key是存在的,那么再次添加进去的时候,返回的将回执里面的旧的值
     */
    private static void demoPut() {
        HashMap<String,String> map = new HashMap<>();
        String a = map.put("1", "a");
        System.out.println("根据key得到的value是:"+a);
        String b = map.put("1", "b");
        System.out.println("根据key得到的value是:"+b);
    }
}

总结
put:不管key是否存在,都将添加新的value进去;
putIfAbsent:如果key不存在,那么才添加进去;
compute:不管key是否存在,都将添加新的value进去;
computeIfAbsent: 如果key存在,那么将不会添加进去;
computeIfPresent:如果key存在,那么才添加新的value进去

posted @ 2021-08-24 01:33  雩娄的木子  阅读(171)  评论(0编辑  收藏  举报