我试图来覆盖提到的方法我HashSet
:如何重写equals(),hashCode()和的compareTo()对于一个HashSet
Set<MyObject> myObjectSet = new HashSet<MyObject>();
为MyObject:
public class MyObject implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String name;
int number;
Map<String,String> myMap;
public MyObject(String name, int number, Map<String,String> myMap) {
this.name = name;
this.number = number;
this.myMap = myMap;
}
[...]
}
如何覆盖hashcode(),equals()和compareTo()方法?
目前,我有以下几点:
public int hashCode() {
return id.hashCode();
}
// override the equals method.
public boolean equals(MyObject s) {
return id.equals(s.id);
}
// override compareTo
public int compareTo(MyObject s) {
return id.compareTo(s.id);
}
,我读了由ID比较是不够的,这是对象是一个数据库中的持久性实体(见here)。
该类型的所有对象的名称和编号都不唯一。
那么我该如何重写它呢?
我还需要比较它里面的hashMap吗?
我很困惑。关于对象唯一的独特之处是地图myMap,它在生命周期的后期被填充。
如何检查其是否相等?
基于所有的回答,我已经改变了方法,下面
@Override
public boolean equals(final Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
final MyComplexObj myComplexObj = (MyComplexObj) o;
return myMap != null ? myMap.equals(myComplexObj.myMap) : myComplexObj.myMap == null;
}
@Override
public int hashCode() {
return myMap != null ? myMap.hashCode() : 0;
}
public int compareTo(MyComplexObj o) {
return myMap.compareTo(o.getMyMap()));
}
这未能在compareTo方法“,该方法是不确定的类型映射
正如你所提到的,关于对象唯一的独特之处是地图中的第一个条目,我会考虑添加一个额外的域,并在其中复制该条目。这样它将成为真实世界的候选关键字,并可用于实现equals和hashcode方法。你能不能详细说明这个对象的生命周期?当这些方法实际上会被调用? – Hassan
我们没有足够的信息来回答你的问题。该ID从哪里来?我在MyObject中看不到ID。你的实体在数据库中的主要关键是什么? –
正如现在写的,这个问题是非常不清楚的。你的代码重写的例子是错误的(因为他们使用equals()的错误参数类型)。然后你使用的是一个没有在MyObject类中定义的id字段?你应该把重点放在首先改善问题上,而不是提供赏金。 – GhostCat