如果我拿一個例如HashSet<E>
,並添加對象,它如何檢查對象是否已經在那裏?套中的唯一性
我有以下簡單的設置:
private class MyObject {
String text;
public MyObject(String text) {
this.text = text;
}
@Override
public boolean equals(Object o) {
if (o != null && o instanceof MyObject) {
return ((MyObject) o).text.equals(text);
}
return false;
}
}
在項目中,我有很多這樣的對象,但都分別初始化。我想篩選雙打,通過將所有的Set
,像這樣:
MyObject m1 = new MyObject("1");
MyObject m2 = new MyObject("1");
MyObject m3 = new MyObject("2");
System.out.println(m1.equals(m2)); //expected: true, result: true
System.out.println(m1.equals(m3)); //expected: false, result: false
Set<MyObject> myObjects = new HashSet<MyObject>();
myObjects.add(m1);
myObjects.add(m2);
myObjects.add(m3);
System.out.println(myObjects.size()); //expected: 2, result: 3
Set<String> stringList = new HashSet<String>();
stringList.add("1");
stringList.add("1");
stringList.add("2");
System.out.println(stringList.size()); //expected: 2, result: 2
我怎樣才能讓這個我myObjects
集不包含這些雙打?所以m1
和m2
是不同的實例,但具有相同的內容,所以我只需要m1
。
編輯
基於馬蒂亞斯施瓦茨的答案,我已經實現了hashCode()
功能如下:
@Override
public int hashCode() {
return text.hashCode();
}
但我將如何,如果我有多個字段一個更復雜的類實現此方法?
對於兩個對象o1,o2,如果o1.equals(o2),那麼他們必須返回相同的hashCode,而你的類MyObject不能確保它。你必須在你的類中實現方法hashCode – gefei