2013-02-12 70 views
1

我想比較兩個對象以查看它們是否相同。我從JSON代碼創建第一個List,並使用InstructionModel的一個實例填充List(數據)。然後通過選擇數據並創建InstructionModel的新實例(模型),將數據與數據庫進行比較。但結果總是假的,我在代碼中做錯了什麼?從List<InstructionModel>比較列表中同一對象的兩個實例

exists = data.contains(model); 

if(!exists) 
{ 
    //Do Some Stuff Here 
} 

數據: enter image description here 數據在InstructionModel對象: enter image description here

+1

你怎麼知道結果總是假? – 2013-02-12 19:35:03

+5

'InstructionModel'中如何實現'equals'?如果它沒有被覆蓋,那麼'contains'就是檢查實際的對象是否存在,這當然是錯誤的。 – 2013-02-12 19:35:17

+2

你是否實現了平等? – 2013-02-12 19:35:28

回答

8

你需要重寫你的InstructionModel類等號方法。 在這種方法中,你比較你的值,如果匹配返回true,否則返回false。

List#contains函數將使用容器中對象的Object#equals函數。如果這個函數沒有被覆蓋,它只會比較引用,而不是實際的值。

此外: 正如註釋所述,如果您重寫'equals'方法,那麼您也需要重寫'hashCode'方法(反之亦然)。集合將使用這些方法來比較對象的實例。例如:如果您不覆蓋兩個,則兩個實例可能在列表中被視爲相同,但在'Hashmap'中不一樣。

+3

記住hashcode方法也必須重新實現,所以如果'a.equals(b)',那麼'a.hashCode()== b.hashCode();' – SJuan76 2013-02-12 19:41:22

+0

@ SJuan76我理解覆蓋equals方法,但爲什麼我必須重寫hashCode方法嗎?和我用什麼重寫? – ios85 2013-02-12 19:58:34

+0

由於其規格說明上述屬性必須爲真。很多邏輯預計它是真實的(例如,'HashMap'等)。 – SJuan76 2013-02-12 20:10:59

1

您可能希望覆蓋InstructionModel上的equals方法。