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

标签 java reflection set

我正在做一些奇怪的事情。我想创建一个 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/

相关文章:

c++ - 了解从链表中删除重复项的复杂性

java - 为什么按下 JButton 后没有任何反应

java - PHP 向 Java 守护进程发送数据

java - 为什么 Netty 使用反射将 sun.nio.ch.SelectorImpl 类中的成员替换为基于数组的集合?

C# 创建 excel 工作表后期绑定(bind)

c++ - STL集查找性能

java - 连接两个 Java 应用程序的适当方法

java - try-with-resources 中的 catch 是否覆盖了括号中的代码?

c# - 如何在运行时使用反射从类对象获取属性值

haskell - 将集合并集实现为幺半群