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

Pao*_*oni 28 java collections

所述Collection.contains()方法检查如果一个集合包含一个给定的对象,使用该.equals()方法来执行比较.

来自Java7 Javadoc:

boolean contains(Object o)

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

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

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

澄清:

  • 无论equals()集合中对象的实现如何,我都想执行此操作.
  • 我不想更改集合中的对象或集合本身.

编辑:

即使我的问题是关于实现的一般解决方案,也可以理解子接口的Collection特定情况Collection.

ars*_*jii 38

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

collection.stream().anyMatch(x -> x == key)
Run Code Online (Sandbox Code Playgroud)


fge*_*fge 11

有一些解决方法......

您可以使用IdentityHashMap,以Void作为值(或任何其他-你的选择).然后,您可以使用contains().keySet()来检查元素的存在(或.containsKey()直接在地图上).

第二种解决方法是使用番石榴Equivalence.identity(); 但是你Collection必须要有类型的元素,Equivalence.Wrapper<X>你必须wrap在检查之前......


奇怪的是,JDK没有提供IdentityHashSet.考虑到HashSet使用a 的内部实现,这是相当奇怪的HashMap,所以人们不得不想知道为什么他们没有为IdentityHashMap... 做同样的事情.


附注:文件Collection具有误导性; 并非所有Collection实现都依赖于.equals().例如,参见SortedSetSortedMap.当然,IdentityHashMap.

  • 如果需要IdentityHashSet,可以使用[`Collections.newSetFromMap`](http://docs.oracle.com/javase/7/docs/api/java/util/Collections.html#newSetFromMap(java.util.Map)). (2认同)