我正在做一些奇怪的事情。我想创建一个 Set,但我想忽略这些对象上的 equals 覆盖,而是想执行 obj1 == obj2 进行 equals 比较(真的)。
想象一下我有几个看起来像这样的对象
public static class BrokenEquals
{
@Override
public int hashCode()
{
return 1;
}
@Override
public boolean equals(Object obj)
{
return true;
}
}
如果我这样做
Set<Object> objs = new HashSet<>();
objs.add(new BrokenEquals());
objs.add(new BrokenEquals()); // objs.size() == 1
显然,Set 的大小为 1(因为两个对象“相等”)。相反,我希望该集合包含两个不同的对象。
但是,如果我这样做
BrokenEquals obj = new BrokenEquals();
Set<Object> objs = new HashSet<Object>();
objs.add(obj);
objs.add(obj); // objs.size() == 1
我希望集合的大小为 1;
我无权更改 .equals 方法
我想要这个的原因是我正在用循环遍历对象图。我不想陷入其中。
最佳答案
您可以使用IdentityHashMap
并忽略这些值(键将形成一个集合)。
网上也有各种 IdentityHashSet
实现。例如,您可以使用 Guava 和 Sets.newIdentityHashSet
:
Set<Object> set = Sets.newIdentityHashSet();
objs.add(obj);
objs.add(obj); // Size will be 1
请注意,我也会尝试以损坏的方式修复实现 equals
的类...
关于java - 是否有一个忽略 .equals 的 java Set 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20861832/