【发布时间】:2016-06-12 08:12:18
【问题描述】:
在我的 java 程序中,我有一个映射,其中包含 someID 和 MyClass 类型的数据对象之间的相关性。
ConcurrentMap<Integer, MyClass> a;
不经常但经常,我必须检查“值”对象之一是否包含某个 long as 变量 b。由于我不知道 someId 与我的 otherId 的关联,因此我无法通过地图访问它。 为此,我想使用 containsValue:
a.containsValue(otherId)
为了实现这一点,我重写了 hashCode 和 equals 函数。
@Override
public boolean equals(Object o) {
if ((o instanceof MyClass) && (((MyClass) o).someId().equals(this.someId()))) {
return true;
} else
if ((o instanceof Long) && ((Long) o) == this.otherId) {
return true;
} else {
return false;
}
}
注意:代码中的otherId不一定是map的someID。
第一个 if 语句是对称的,第二个显然不是。我知道这不好,但是每次写一个循环也不好。 在this post 中,他们说不对称的等号将被忽略。如何让java忽略不对称问题?
【问题讨论】:
-
equals 根据定义必须是对称的,在这种情况下,您不能让它“忽略”问题,因为您不能修改
Long类。如果您的密钥可以是Long,只需将其设为 Long。 -
尽可能避免在地图上调用
containsValue,因为这是O(n)操作。