在Java中哪一个更好用于HashMap的getOrDefault()或putIfAbsent()

时间:2015-04-09 13:05:31

标签: java dictionary

如果我不得不在HashMap中为一个键(对于许多键)设置值,那么哪个键更好用。 getOrDefault()或putIfAbsent() 因为如果已经设置了密钥,该方法将返回与密钥关联的值。 两者都将键值对作为参数。

3 个答案:

答案 0 :(得分:10)

是的,如果已经设置了密钥,它们都将返回与密钥关联的值,但是一个只是一个getter,而另一个是setter。

<强>的putIfAbsent

  

如果指定的键尚未与值关联(或者是   映射到null)将其与给定值相关联并返回null,   else返回当前值。


<强> getOrDefault

  

返回指定键映射到的值,或   如果此映射不包含键的映射,则为defaultValue。


如果您的目标只是检索值,请使用getOrDefault。否则,如果要在不存在时设置值,请使用putIfAbsent

根据你的第一句话,

  

如果不是,我必须在HashMap中为键(对于许多键)设置值   然后出现哪一个更好

您应该使用putIfAbsent

答案 1 :(得分:8)

在Java8中还有computeIfAbsent返回值(如果存在)或者如果不存在则通过lambda函数创建它,将其添加到Map并返回其值。

Value v = map.computeIfAbsent(key, k -> new Value(f(k)));

答案 2 :(得分:2)

getOrDefault()不会改变地图,因此如果您随后检查了其内容,则无法在地图中找到这些值,例如

HashMap<String, String> map = new HashMap<>();
map.getOrDefault("something", "default");  // returns "default"
assertTrue(map.isEmpty());

putIfAbsent()会改变地图,因此如果您随后检查了其内容,您会在地图中找到这些值,例如

HashMap<String, String> map = new HashMap<>();
map.putIfAbsent("something", "default");
assertFalse(map.isEmpty());

你应该选择一个适合你需要的那个。