jdk 8 hashMap相关知识点

1. compute、 computeIfAbsent、computeIfPresent

这三个是 Java Map 接口中的三个方法,用于对 Map 中的键值对进行操作。它们的区别在于执行的时机和操作的方式:

compute(K key, BiFunction remappingFunction):

  • compute 方法用于计算给定键的新值,该方法接受一个键和一个计算函数 remappingFunction 作为参数。
  • 如果 Map 中存在指定的键,则会将键对应的值和计算函数一起传递给 remappingFunction,并用 remappingFunction 返回的结果更新该键的值。
  • 如果 Map 中不存在指定的键,则 remappingFunction 不会被调用,方法不会进行任何操作。
Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);

map.compute("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2
map.compute("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以v没有值,会报错NullPointerException

computeIfAbsent(K key, Function mappingFunction):

  • computeIfAbsent 方法用于在给定的键在 Map 中不存在时,根据键的映射关系计算一个值并将其插入到 Map 中
  • 如果键已经存在于 Map 中,则 computeIfAbsent 方法不会执行计算,而是返回现有的值。
Map<String, List<Integer>> map = new HashMap<>();
// 检查键 "key1" 是否存在于 Map 中,如果不存在,则使用 lambda 表达式计算值
map.computeIfAbsent("key1", k -> new ArrayList<>()).add(42);
// 检查键 "key2" 是否存在于 Map 中,如果不存在,则使用 lambda 表达式计算值
map.computeIfAbsent("key2", k -> new ArrayList<>()).add(123);
// 检查键 "key1" 是否存在于 Map 中,由于它已存在,不会执行计算,只会添加到现有的列表中
map.computeIfAbsent("key1", k -> new ArrayList<>()).add(99);
System.out.println(map); // 输出:{key1=[42, 99], key2=[123]}
Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);

map.computeIfAbsent("key1", k -> 2); // 不会执行计算函数,键 "key1" 对应的值仍为 1
map.computeIfAbsent("key2", k -> 2); // 键 "key2" 不存在,计算函数返回 2,现在键 "key2" 对应的值是 2
System.out.println(map); // 输出:{key1=1, key2=2}

computeIfPresent(K key, BiFunction remappingFunction):

  • computeIfPresent 方法用于在 Map 中存在指定的键时,根据键的值计算新的值。
  • 如果 Map 中不存在指定的键,则不会执行计算函数 remappingFunction,方法不会进行任何操作。
Map<String, Integer> map = new HashMap<>();
map.put("key1", 1);

map.computeIfPresent("key1", (k, v) -> v + 1); // 现在键 "key1" 对应的值是 2
map.computeIfPresent("key2", (k, v) -> v + 1); // 因为键 "key2" 不存在,所以不会进行操作
System.out.println(map); // 输出:{key1=2}

总结:

  • compute 方法无论键是否存在都会执行计算函数。
  • computeIfAbsent 方法仅在键不存在时执行计算函数。
  • computeIfPresent 方法仅在键存在时执行计算函数。

这些方法允许您对 Map 中的键值对进行灵活的操作,根据需要更新、插入或删除键值对。

2. getOrDefault

getOrDefault(Object key, V defaultValue) 方法是 Java Map 接口的一个方法,用于获取指定键的值,如果该键不存在于 Map 中,则返回一个默认值。该方法的签名如下:

V getOrDefault(Object key, V defaultValue)
  • key 是要检索的键。
  • defaultValue 是在键不存在时返回的默认值。
Map<String, Integer> map = new HashMap<>();
map.put("apple", 5);
map.put("banana", 3);

int countApple = map.getOrDefault("apple", 0); // 返回值为 5,因为 "apple" 存在于 Map 中
int countGrapes = map.getOrDefault("grapes", 0); // 返回值为 0,因为 "grapes" 不存在于 Map 中

总结:

这个方法通常用于避免在获取值之前需要先检查键是否存在的情况,提供了一种简洁的方式来处理这种情况。如果键不存在,它会返回指定的默认值,而不会引发异常。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值