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方法
我想要这个的原因是我正在遍历带有循环的对象图.我不想陷入其中.
您可以使用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以破碎方式实施的类......