我试图重写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比较是不够的,因为这个对象是数据库中的持久化实体(请参见这里)。
这种类型的所有对象中,名称和编号并不是唯一的。
那么我应该如何重写它呢?
我需要同时比较其中的hashMap吗?
我很困惑。这个对象唯一的特点就是在其生命周期后期填充的map 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方法中出现错误,"此方法对于类型Map未定义"
MyObject
中看不到ID。你的实体在数据库中的主键是什么? - Guillaume F.hashcode/equals/compareTo
方法呢?您也不希望在将对象添加到哈希集之后更改这些值。 - matt