2013-04-14 58 views
-2
class EventManager{ 
    public String unique_ID; 
    public List<Object> infoList; 

    public EventManager(String ID, List<Object> infoList){ 
     this.unique_ID = ID; 
     this.infoList = infoList; 
    } 
} 

如果這個類是使用map鍵的,我需要實現自己的hashcode和equal()方法嗎?我是否需要創建自己的哈希和平等方法?

如果需要,只需散列unique_ID就足夠了?謝謝。

謝謝。

+1

見第一個答案爲[這個問題] [1],其中,上述問題重複。 [1]:http://stackoverflow.com/questions/11281166/using-hashmap-with-custom-key –

回答

0

除非你想覆蓋hashCode的值,並等於給他們一個不同的behaviour

如果不是,您可以使用默認值,並且每個不同的對象都有不同的hashCode,這或多或少都由JVM保證。

例如,如果您希望在某些條件滿足的情況下能夠說兩個對象相同(例如,只是unique_ID相同),則只需覆蓋equals

如果覆蓋equals,那麼你必須覆蓋hashCode,以尊重的對象,合同:

的等於Object類的方法實現對象上最挑剔的 可能等價關係;也就是說,對於任何非空 引用值x和y,當且僅當x 和y引用同一對象(x == y的值爲true)時,此方法返回true。

注意,這是通常需要覆蓋hashCode方法 每當這個方法被覆蓋,以便維持對hashCode方法,其中指出,等於對象必須 具有相等的哈希碼的一般 合同。

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals(java.lang.Object)

+0

對於任何類,如果我不定製的哈希碼和相等,任何兩個實例總是被視爲不同的,因爲它們的地址總是不同的。對? – user697911

+0

是的,沒錯。如果兩個實例不同,它們將具有不同的hashCode。 – pcalcao

0

明白,如果你不重寫等於那麼如果他們是兩個實例只會是平等的,事實上,同樣的情況下(即等於地址)。如果你希望包含相同字段的實例被視爲平等,你需要實現你自己的版本。

如果覆蓋相等,那麼您也必須重寫散列碼,以確保兩個相同的實例返回相同的散列碼。不這樣做會導致HashMap等失敗。

請注意,散列碼始終返回6或其他固定值是完全合法的(雖然很愚蠢)。它的一定不是做的是返回兩個不同的hashcode值的平等實例。

1

如果你沒有定義你自己的散列碼,我相信它會使用該對象的地址。所以如果你使用相同的id創建兩個實例,它們將不會散列到同一個桶中。你可能想使用id來實現平等。作爲一個方面說明,除非你能保證不變,否則確保不要在你的平等或散列中使用List。

How default .equals and .hashCode will work for my classes?

相關問題