使用 java Map.containsKey() 在使用 map.get() 时是否冗余

2022-08-31 10:14:52

一段时间以来,我一直在想,在最佳实践中是否允许避免使用 on 的方法,而是对 的结果进行空检查。containsKey()java.util.Mapget()

我的理由是,对值进行两次查找似乎是多余的 - 首先针对 ,然后再次针对 .containsKey()get()

另一方面,可能是大多数标准实现缓存最后一次查找,或者编译器可以取消冗余,并且为了代码的可读性,最好维护该部分。MapcontainsKey()

我非常感谢您的评论。


答案 1

某些 Map 实现允许具有空值,例如 HashMap,在这种情况下,如果返回,则不保证映射中没有与此键关联的条目。get(key)null

因此,如果您想知道地图是否包含密钥,请使用.如果您只需要一个映射到键的值,请使用 。如果此映射允许 null 值,则返回值 null 并不一定表示映射不包含键的映射;在这种情况下是无用的,并且会影响性能。此外,在并发访问映射的情况下(例如),在测试之后,在调用 之前,该条目可能会被另一个线程删除。Map.containsKeyMap.get(key)Map.containsKeyConcurrentHashMapMap.containsKey(key)Map.get(key)


答案 2

我认为写得相当标准:

Object value = map.get(key);
if (value != null) {
    //do something with value
}

而不是

if (map.containsKey(key)) {
    Object value = map.get(key);
    //do something with value
}

它的可读性并不差,效率也略高,所以我看不出有任何理由不这样做。显然,如果您的地图可以包含 null,则这两个选项不具有相同的语义


推荐