是否有一个忽略.equals的java Set集合

Cog*_*man 2 java reflection set

我在做一些奇怪的事情.我想创建一个Set,但是我想忽略那些对象上的equals覆盖,而是我想为等于比较(真的)做obj1 == obj2.

所以想象一下,我有几个看起来像这样的物体

public static class BrokenEquals
{
    @Override
    public int hashCode()
    {
        return 1;
    }


    @Override
    public boolean equals(Object obj)
    {
        return true;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果我这样做

    Set<Object> objs = new HashSet<>();
    objs.add(new BrokenEquals());
    objs.add(new BrokenEquals()); // objs.size() == 1
Run Code Online (Sandbox Code Playgroud)

显然,Set的大小为1(因为这两个对象是"相等的").相反,我希望该集合包含两个不同的对象.

但是,如果我这样做

    BrokenEquals obj = new BrokenEquals();
    Set<Object> objs = new HashSet<Object>();
    objs.add(obj);
    objs.add(obj); // objs.size() == 1
Run Code Online (Sandbox Code Playgroud)

我希望集合的大小为1;

我没有权限更改.equals方法

我想要这个的原因是我正在遍历带有循环的对象图.我不想陷入其中.

Jon*_*eet 7

您可以使用IdentityHashMap并忽略这些值(键将形成一个集合).

IdentityHashSet网上也有各种各样的实现方式.例如,您可以使用Guava Sets.newIdentityHashSet:

Set<Object> set = Sets.newIdentityHashSet();
objs.add(obj);
objs.add(obj); // Size will be 1
Run Code Online (Sandbox Code Playgroud)

请注意,我也会尝试修复equals以破碎方式实施的类......