[英]Do I need to create my own hash and equal methods?
class EventManager{
public String unique_ID;
public List<Object> infoList;
public EventManager(String ID, List<Object> infoList){
this.unique_ID = ID;
this.infoList = infoList;
}
}
如果這個類用作映射鍵,我是否需要實現自己的 hashcode 和 equal() 方法?
如果需要,只需散列 unique_ID 就足夠了嗎? 謝謝。
謝謝。
如果您不定義自己的哈希碼,我相信它會使用對象的地址。 因此,如果您創建兩個具有相同 id 的實例,它們將不會散列到同一個存儲桶。 您可能想使用 id 來表示平等。 作為旁注,除非您可以保證不變性,否則請確保不要在相等或散列中使用 List。
除非您想覆蓋hashCode
和 equals 的值以賦予它們不同的behaviour
。
如果沒有,您可以只使用默認值,並且每個不同的對象都將具有不同的hashCode
,在某種程度上由 JVM 或多或少地保證。
您只需要覆蓋equals
,例如,如果您希望能夠在滿足某些條件時說兩個對象相同(例如,只有unique_ID
相同)。
如果您確實覆蓋了equals
,那么您必須覆蓋hashCode
,以尊重對象合同:
Object 類的 equals 方法實現了對象上最有區別的可能等價關系; 也就是說,對於任何非空引用值 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)
明白如果你不覆蓋equals,那么兩個實例只有在它們實際上是相同的實例(即相等的地址)時才會相等。 如果您希望包含相等字段的實例被視為相等,則需要實現您自己的版本。
如果您覆蓋 equal 那么您也必須覆蓋哈希碼,以確保兩個相等的實例返回相同的哈希碼。 不這樣做將導致 HashMap 等失敗。
請注意,哈希碼始終返回 6 或其他一些固定值是完全合法的(盡管很愚蠢)。 它不能做的是為相同的實例返回兩個不同的哈希碼值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.