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进去
从理论中来,到实践中去,最终回归理论