2013-07-09 25 views
-1

問題我有一個單個元素的Set<SelectDTO>和我使用它和一個新的SelectDTO。載有失敗的時候,如下:與集<>包含和hashCode

Set<SelectDTO> setDTOs = new HashSet<SelectDTO> 
//processing where an element with <name = "ME101", id = 102> is added. 

SelectDTO selectDTO = new SelectDTO(); 
selectDTO.setName("ME101"); 
selectDTO.setId(102); 
if (!setDTOs.contains(selectDTO)){ 
    throw new Exception(); 
} 

我有覆蓋SelectDTO的.hashCode(),因此它被計算爲參數id和名稱的總和。我已調試並確認執行兩次:.hashCode():第一次將元素添加到集合中,第二次調用.contains()。這兩個元素的hashCode是-2024486876。而且,在調試時,我發現該集合中的表具有單個元素,其「散列」爲-1909995738。

這是我的hashCode的代碼,雖然我不認爲這個問題的存在:

@Override 
public int hashCode() { 
    int result = 0; 
    result += this.getName() != null ? this.getName().hashCode() : 0; 
    result += this.getId() != null ? this.getId() : 0; 
    return result; 
} 

我想這.contains()使用此「哈希」值進行比較,但我不知道爲什麼。

回答

4

Set.contains() documentation

返回true如果set包含指定的元素。更正式地,返回true當且僅當這個集合包含一個元素e使得(o==null ? e==null : o.equals(e))

換言之,您不僅需要執行hashCode(),還需要執行equals()

+0

就是這樣。 'equals()'已經被覆蓋,我認爲它是比較字段,但它看起來像是比較引用。謝謝。 –

0

看來你忘了在設置中添加selectDTO元素:

setDTOs.add(selectDTO); 

假設你已經在你的代碼的某處添加的元素,那麼你需要重寫equals方法,而不是哈希碼。由於contains()方法使用equals()方法來確定集合中是否存在元素。有趣的是,我相信這是Set如何確保它不會在Set中推送重複元素。

+0

不,它已添加,但未在此處顯示。在我說//處理的部分 –

+0

根據問題,元素被添加到集合中(請參閱第一個代碼塊的第二行)。 – mthmulders

+0

@mthmulders根據提問者收到的評論更新了我的答案 –

相關問題