HashMap 在我们日常的开发中使用频率最高的一个工具类之一,然而使用 HashMap 最大的问题之一就是它是线程不安全的,如果我们想要线程安全, 这时候就可以选择使用 ConcurrentHashMap,ConcurrentHashMap 和 HashMap 的功能是基本一样的,ConcurrentHashMap 是 HashMap 的线程安全版本。
putIfAbsent
主要是在向ConcurrentHashMap中添加键—值对的时候,它会先判断该键值对是否已经存在。
如果不存在(新的entry),那么会向map中添加该键值对,并返回null。
如果已经存在,那么不会覆盖已有的值,直接返回已经存在的值。
computeIfAbsent:如果不存在则初始化
computeIfAbsent方法的作用是如果key值不存在,则初始化value,它分为两种情况
如果key存在,不作任何处理。
如果key不存在,执行后面的函数表达式,并将结果作为value放入。
value的数值也会对执行结果造成影响,如果value不为null,则存储成功。如果value为null,则返回null,因为ConcurrentHashMap的value不能为null
map.computeIfAbsent("",k->{
return 1;
});
computeIfPresent:如果存在则修改
computeIfPresent方法的作用是如果key存在,则修改对应的value,它分为两种情况
如果key不存在,则将返回null。
如果key存在,则将修改key和对应value的数值,value根据函数表达式结果决定。
value的数值也会对执行结果造成影响,如果value不为null,则存储成功。如果value为null,则将当前的key-value删除,相当于执行了一次remove(key),如果函数式异常,则不会影响到原key-value
map.computeIfPresent("",(k,v)->{
return 1;
});
compute:无论是否存在,都将数值赋予
compute方法相当于computeIfPresent与computeIfAbsent的结合体,它分为两种情况
如果key不存在,则将初始化对应的key-value
如果key存在,则修改key-value的对应数值
map.computeIfPresent("",(k,v)->{
return (v == null) ? 1 : v+1;
});
put(K,V) - 向map中插入key/value 键值对数据
putAll(map) - 把另一个map中的所有entries插入到当前的map中
putIfAbsent(K,V) - 向map中插入key/value 键值对数据,如果该键值对的key在map不存在则插入数据,否则不做操作。
entrySet() -获取 map中key/value 键值对集合
keySet()- 获取map中所有的key的集合
values()- 获取map中所有的value的集合
get() - 获取指定key元素的value值,如果key不存在返回null
getOrDefault() - 获取指定key元素的value值,如果key不存在返回一个指定的默认值
remove(key) - 根据指定的key删除map中的元素,并将该元素返回
remove(key, value) - 只有当map中存在指定的键映射到指定的值时,才会从map中删除条目,并返回一个布尔值。返回true表示删除成功,否则表示map中没有这个键值对。