一段时间以来,我一直在想,在最佳实践中,是否允许在java.util.Map
上不使用containsKey()
方法,而是对get()
的结果执行null检查。
我的理由是,查找两次值似乎是多余的-第一次查找containsKey()
,第二次查找get()
。
另一方面,可能是Map
的大多数标准实现缓存了最后一次查找,或者编译器可以以其他方式消除冗余,并且为了代码的可读性,最好维护containsKey()
部分。
我将非常感谢你的意见。
发布于 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)
之前,该条目可能会被另一个线程删除。
发布于 2013-01-31 01:29:46
正如assylias所指出的,这是一个语义问题。通常,Map.get(x) == null是您想要的,但在某些情况下,使用containsKey很重要。
一种这样的情况是缓存。我曾经在一个web应用程序中处理过一个性能问题,该应用程序频繁地查询其数据库,寻找不存在的实体。当我研究该组件的缓存代码时,我意识到如果cache.get(键) == null,它就是在查询数据库。如果数据库返回null (entity not found),我们将缓存该键-> null映射。
切换到containsKey解决了这个问题,因为到空值的映射实际上是有意义的。到null的键映射与键不存在具有不同的语义含义。
发布于 2016-06-24 22:42:44
我们可以使用Java8 Optional使@assylias答案更具可读性,
Optional.ofNullable(map.get(key)).ifPresent(value -> {
//do something with value
};)
https://stackoverflow.com/questions/14601016
复制相似问题