【问题标题】:Overriding equals for CopyOnWriteArraySet.add and remove覆盖 CopyOnWriteArraySet.add 和 remove 的等于
【发布时间】:2014-07-23 20:42:02
【问题描述】:

我有下面这样的课程

class A {
    @Override
    public boolean equals(Object other) { return true }
}

Class B extends A {
}

Class C extends A {
    @Override
    public boolean equals(Object other) { if ((other != null) || (other instanceOf B)) return false; }
}

In my main() I have this following code
Set<A> mySet = new CopyOnWriteArraySet<A>();

mySet.add(C);
I want mySet to contain C at this point

mySet.add(B); // #1
I want mySet to contain C & B at this point

mySet.remove(B); // #2
I want mySet to contain C at this point

我想创建一个全局队列,如果队列 B 中存在对象 C,则应该允许添加,但不能反过来。所以在#1 之前,我循环遍历集合中的元素,执行 element.equals(B) 并添加 false。

但是 1 正在调用返回 true 的 B.equals(C),因此 mySet 在这一行之后只有一个 C 对象

2 再次调用 B.equals(C) ,它返回 true 并删除现有对象 C。在这种情况下不应该是 C.equals(B) 吗?我希望这条线没有行动

这是对 CopyOnWriteArraySet 的错误使用吗?

感谢观看

【问题讨论】:

  • 你的 equals 方法实现不正确,所以依赖于 equals 的 Collections API 中的各种事情都会出现异常。
  • equals 必须是关联的,如 Object.equals() 中所述,即 a.equals(b) == b.equals(a) 否则您会感到困惑。
  • 另外,Object.equals(null) 应该总是返回 false
  • 让我重新提出我的问题,关于我打算在我的情况下做什么
  • @PeterLawrey 这是对称的,不是关联的

标签: java equals copy-on-write


【解决方案1】:

找到equal()的元素是正确的行为,所以它删除了第一个元素

如果存在,则从该集合中删除指定元素。更正式地说,如果该集合包含这样一个元素,则删除一个元素 e,例如 (o==null ? e==null : o.equals(e))。如果此 set 包含该元素(或等效地,如果此 set 由于调用而更改),则返回 true。 (一旦调用返回,此集合将不包含该元素。)...

【讨论】:

  • 是的。但我的意图是允许在 C 在集合中时添加 B,而不是相反。我也想用 remove(B) 和 remove(C) 删除 B 或 C,而不是随机删除。我的问题是这个 copyonwritearrayset 是否适合我的任务?
  • Set 不允许重复,它会根据 equals() 和(hashcode() 在基于哈希的数据结构的情况下)检查重复,如果您希望它允许重复切换到 List
  • 我使用了 CopyOnWriteArrayList 但问题是当我调用 add(C) 和 add(B) 时,列表有两个元素,而当我执行 remove(B) 时,它正在删除 C。
  • 因为B equals C 我怀疑它甚至添加了C
  • 添加元素时List不会调用equals
【解决方案2】:

HashSet 是适合我的情况的正确集合。除非有 hashCode 匹配,否则在添加元素时它不会调用 equals。这样我仍然可以将我的 equals 方法用于我的特定目的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多