首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在使用map.get()时,使用java Map.containsKey()是否多余

在使用map.get()时,使用java Map.containsKey()是否多余
EN

Stack Overflow用户
提问于 2013-01-30 17:53:22
回答 4查看 63.8K关注 0票数 96

一段时间以来,我一直在想,在最佳实践中,是否允许在java.util.Map上不使用containsKey()方法,而是对get()的结果执行null检查。

我的理由是,查找两次值似乎是多余的-第一次查找containsKey(),第二次查找get()

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

我将非常感谢你的意见。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-01-30 17:56:39

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

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

票数 116
EN

Stack Overflow用户

发布于 2013-01-31 01:29:46

正如assylias所指出的,这是一个语义问题。通常,Map.get(x) == null是您想要的,但在某些情况下,使用containsKey很重要。

一种这样的情况是缓存。我曾经在一个web应用程序中处理过一个性能问题,该应用程序频繁地查询其数据库,寻找不存在的实体。当我研究该组件的缓存代码时,我意识到如果cache.get(键) == null,它就是在查询数据库。如果数据库返回null (entity not found),我们将缓存该键-> null映射。

切换到containsKey解决了这个问题,因为到空值的映射实际上是有意义的。到null的键映射与键不存在具有不同的语义含义。

票数 8
EN

Stack Overflow用户

发布于 2016-06-24 22:42:44

我们可以使用Java8 Optional使@assylias答案更具可读性,

代码语言:javascript
复制
Optional.ofNullable(map.get(key)).ifPresent(value -> {
     //do something with value
};)
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14601016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档