2013-08-17 28 views
3

我有一個arrayList,我想使用包含(Thing o)方法來檢查這兩個對象的相等性,並且重寫了Thing類中的equals()方法,但這不起作用當我打電話包含方法! 這是我的事類:如何評價兩個對象在java中的列表

public class Thing{ 

private int id; 

//getter setter 

@Override 
public boolean equals(Object o) { 
    if(!(o instanceof Thing)) 
     return false; 
    if(id == ((Thing)o).getId()) 
     return true; 
    return false; 
} 
} 

是它需要覆蓋的hashCode()方法呢?如果是的話如何覆蓋它?

+5

燦你展示瞭如何使用'contains'方法?是的,當你覆蓋其中一個時,你總是應該覆蓋equals和hashcode。 –

+0

重寫hashcode是一種很好的做法,但對你的情況無濟於事。要覆蓋它,你可以簡單地'返回ID;'... – assylias

+0

'dblist'是列表,我有一個帶'nlo'名字的Thing對象。 'if(dblist.contains(nlo)){ // do something }' – 013

回答

4

您應該覆蓋hashCode。該ArrayList類不使用hashCode方法,因此沒有必要現在,但如果在任何時候,你要使用你的類HashMapHashSet,或任何其他集合確實使用hashCode,該計劃將打破,因爲hashCode and equals are not consistent

對於這種情況下的簡單實現的hashCode可能是:

public int hashCode() { 
    return id; 
} 
1

如果你重寫equals(),你應該總是重寫了hashCode()了。通過使用Eclipse IDE,您只需爲您生成該方法即可。菜單 - >來源 - >生成hashCode()和equals()方法

2

是的,這是必不可少的重載hashCode()每當ü覆蓋等於:

  • 如果不這樣做凌駕於hashCode()方法中,來自 「Object」類的默認行爲是爲每個對象提供一個唯一的hashCode。

  • 這個獨特的hashCode將意味着兩個不同的對象實例,除非您重寫hashCode()以提供相同的值。

    public int hashCode(){ return this.id; }

你不必手動編寫這樣當您使用的是Eclipse :) 右擊上java文件打開 - >來源 - >生成hashCode()和equals()方法

相關問題