检查集合是否包含对象,并按引用进行比较

2022-09-01 12:45:57

Collection.contains() 方法检查集合是否包含给定的对象,使用该方法执行比较。.equals()

来自 Java7 Javadoc:

布尔包含(对象 o)

如果此集合包含指定的元素,则返回 true。更正式地说,当且仅当此集合包含至少一个元素 e 时,返回 true,使得 (o==null ? e==null : o.equals(e))。

有没有一种聪明的方法来检查集合是否包含对象,但通过引用进行比较(即)?oo==e

当然,我可以遍历集合并进行检查,我正在寻找可以做到这一点的现有函数。

澄清:

  • 我想执行此操作,而不考虑集合中对象的实现。equals()
  • 我不想更改集合中的对象,也不想更改集合本身。

编辑:

尽管我的问题是关于实现的一般解决方案,但子接口的具体情况也将不胜感激。CollectionCollection


答案 1

对于我们这些使用Java 8的人来说,Collection#stream()是一个干净的选项:

collection.stream().anyMatch(x -> x == key)

答案 2

有某种解决方法...

您可以使用 IdentityHashMap,并带有 as 值(或其他任何内容 - 您的选择)。然后,您可以使用它来检查元素的存在(或直接在地图上)。Voidcontains().keySet().containsKey()

第二种解决方法是使用番石榴和Equivalence.identity();但是,您必须具有类型的元素,并且在检查之前必须这样做...CollectionEquivalence.Wrapper<X>wrap


奇怪的是,JDK 没有提供 .考虑到内部实现使用 a,这是相当奇怪的,所以人们不得不怀疑为什么他们没有做同样的事情...IdentityHashSetHashSetHashMapIdentityHashMap


附注:文件具有误导性;并非所有集合实现都依赖于 .equals()。。例如,请参见或 。当然,还有.CollectionSortedSetSortedMapIdentityHashMap