在不撤回已处理对象的情况下处理多个对象的最佳方法是什么?

What is the best method to treat multiple objects, without retreating already treated objects?

假设我想在某些更高级别的算法过程中使用某种方法 treat(Object o) 处理某些 class Object 的多个对象。在这个算法中,可能会出现相同的对象(不具有相同的地址),所以我不想处理所有这些相同的对象,只处理第一个出现的对象,忽略其他对象。

一个简单的解决方案是实现一个 ArrayList 结构来存储所有已处理的对象,命名为 treated,并执行以下操作。

if (!treated.contains(o)){
    treat(o);
    treated.add(o);
}

但是,我认为 contains 方法在线性时间内运行,而使用 HashSet 而不是 ArrayList 将能够在常数时间内完成。

这是我的问题:相同的哈希码不能确保相等。换句话说,使用 HashSet treated 如下:

if (!treated.contains(o)){
    treat(o);
    treated.add(o);
}

可能不会处理所有不同的对象,因为某些对象 o1 可能最终具有与不同对象 o2 相同的哈希码。如果 o1 被处理,那么 o2 就不会被处理,反之亦然。 HashMap treated 与某些 equals() 一起使用是否更适合我的问题?

if (treated.containsKey(o.hashCode())){
    Object o2 = treated.get(o.hashCode());
    if (!o.equals(o2)){
        treat(o);
    }
} else {
    treat(o);
    treated.put(o.hashCode(), o);
}

解决此问题的推荐方法是什么?

注意:我看到过关于使用 "perfect hashcode"、 的评论,即 为每个唯一对象分配唯一值的哈希码,因此不会为不同的对象获得类似的哈希码对象。我不认为这是一个解决方案,因为(从理论上讲)我可以处理任意数量的不同对象,而哈希码是 int 类型,它有效地限制了不同哈希码的数量。

In other words, using HashSet treated as follows [...] might not treat all distinct objects, since some object o1 might end up having the same hashcode as a different object o2

这是基于一个错误的假设,即 HashSet.contains 只检查哈希码。它没有 - 它使用哈希码找到相等的 候选者 ,但随后检查与 equals 的实际相等性。

来自contains method documentation

Returns true if this set contains the specified element. More formally, returns true if and only if this set contains an element e such that Objects.equals(o, e).