Map是做软件开发中使用频率最高的数据结构之一。它的最大特点是能够快速地进行查找和更改数据,经常被用做缓存以及数据重复检查场景中。很多人在给Map赋值过程中只知道最基础的put方法,下面我将给大家详细介绍下其他赋值方法的区别。
put:【添加】
key不存在,直接添加,put方法返回null;
key存在,新值覆盖旧值,put方法返回旧值。
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("1->"+map.put(1, "a"));
System.out.println("2->"+map.put(2, "b"));
System.out.println("3->"+map.put(2, "c"));
System.out.println("4->"+map);
//控制台输出:
// 1->null
// 2->null
// 3->b
// 4->{1=a, 2=c}
}
putIfAbsent:【不存在则添加】
key不存在,直接添加,putIfAbsent方法返回null;
key存在,不进行操作,putIfAbsent方法返回旧值。
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("1->"+map.putIfAbsent(1, "a"));
System.out.println("2->"+map.putIfAbsent(2, "b"));
System.out.println("3->"+map.putIfAbsent(2, "c"));
System.out.println("4->"+map);
//控制台输出:
// 1->null
// 2->null
// 3->b
// 4->{1=a, 2=b}
}
compute:【计算】
计算后结果为null,删除当前key,compute方法返回null;
计算后结果不为null,分为以下两种情况:
key不存在,直接添加,compute方法返回新值;
key存在,新值覆盖旧值,compute方法返回新值。
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("1->"+map.compute(1, (k, v) -> k + "a"));
System.out.println("1->"+map);
System.out.println("2->"+map.compute(1, (k, v) -> k + "b"));
System.out.println("2->"+map);
System.out.println("3->"+map.compute(1, (k, v) -> null));
System.out.println("3->"+map);
System.out.println("4->"+map.compute(2, (k, v) -> null));
System.out.println("4->"+map);
//控制台输出:
// 1->1a
// 1->{1=1a}
// 2->1b
// 2->{1=1b}
// 3->null
// 3->{}
// 4->null
// 4->{}
}
computeIfAbsent:【不存在则计算】
key不存在,直接添加,computeIfAbsent方法返回新值;
key存在,不进行操作,computeIfAbsent方法返回旧值;
计算为null,不进行操作,key存在时computeIfAbsent返回旧值,不存在时返回null。
使用场景:
map值为列表时,如果是个不存在的key,则需要先初始化一个列表;如果是个存在的key,则从map中取到此列表。最后给列表添加元素,再把列表放入到map中。
如果用computeIfAbsent,则可以直接获取list而不需要判断key存不存在。
Map> map = new HashMap<>(); List list=map.computeIfAbsent(mapKey, k -> new ArrayList<>()); list.add("a"); map.put(mapKey,list);
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("1->"+map.computeIfAbsent(1, k -> k + "a"));
System.out.println("1->"+map);
System.out.println("2->"+map.computeIfAbsent(1, k -> k + "b"));
System.out.println("2->"+map);
System.out.println("3->"+map.computeIfAbsent(1, k -> null));
System.out.println("3->"+map);
System.out.println("4->"+map.computeIfAbsent(2, k -> null));
System.out.println("4->"+map);
//控制台输出:
// 1->1a
// 1->{1=1a}
// 2->1a
// 2->{1=1a}
// 3->1a
// 3->{1=1a}
// 4->null
// 4->{1=1a}
}
computeIfPresent:【存在则计算】
计算后结果为null,删除当前key,compute方法返回null;
计算后结果不为null,分为以下两种情况:
key不存在,不进行操作,computeIfPresent方法返回null;
key存在,新值覆盖旧值,computeIfPresent方法返回新值;
public static void main(String[] args) {
Map map = new HashMap<>();
System.out.println("1->"+map.computeIfPresent(1, (k, v) -> k + "a"));
System.out.println("1->"+map);
map.put(1,"A");
System.out.println("2->"+map.computeIfPresent(1, (k, v) -> k + "b"));
System.out.println("2->"+map);
System.out.println("3->"+map.computeIfPresent(1, (k, v) -> null));
System.out.println("3->"+map);
System.out.println("4->"+map.computeIfPresent(2, (k, v) -> null));
System.out.println("4->"+map);
//控制台输出:
// 1->null
// 1->{}
// 2->1b
// 2->{1=1b}
// 3->null
// 3->{}
// 4->null
// 4->{}
}