2017-03-11 31 views
0

我發現了類似的問題,但目前爲止他們都沒有真正幫助我(這可能意味着我做錯了某些事情,這就是爲什麼我在這裏)。使用對象的實例作爲HashMap鍵

我有一個HashMap Map<Integer, List<Book>>是應該有一個StudentID的關鍵,他有在他身上的價值Book列表。雖然只有通過ID作爲關鍵工作,但我覺得它不是一個面向對象的方法,我應該使用Student作爲關鍵(因此它看起來像這樣:Map<Student, List<Book>>)。我試圖使用它,但當我試圖返回給定的StudentBook列表時,我收到了一堆錯誤,很可能是因爲找不到Student。我的教授建議我@Override Java的hashCodeequals方法,這是有道理的,因爲這是如何比較鍵,但我沒有在那成功(我不知道我究竟需要比較才能看到兩個Student是一樣的;據推測,他們的ID應該單獨工作)。這裏是重寫的方法:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + id; 
    return result; 
} 

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Student other = (Student) obj; 
    if (id != other.id) 
     return false; 
    return true; 
} 

我在做什麼錯?任何你可以解決的問題都會非常有幫助。提前致謝!

+3

的錯誤是在其他地方。發佈一個完整的重現問題的最小例子。 –

+0

'if(id!= other.id) return false; return true;'你爲什麼喜歡這個'return id.equals(other.id);'? –

回答

1

的誤差似乎是在你的equals方法,提供你的id具有值的範圍之外的整數的高速緩存範圍即-128 - 127

if (id != other.id) // <-- Error 
     return false; 

從你的例子,好像ID是一個Integer對象

==檢查引用是否相等,即它們是否指向相同的對象。

對於原始類型,==檢查值是否相等。

java.lang.Integer是一個引用類型。 int是一個原始類型。

雖然在整數的情況下,==僅適用於數字-128 和127之間爲緩存JVM這些值

您需要將其更改爲

if (!id.equals(other.id)) 
      return false; 
+0

可能,但由於那些看起來像自動生成的方法,我猜這個id是一個原始的。 – BarrySW19

+0

由於OP在地圖中使用Integer作爲鍵,因此我相信id是一個Integer實例 – Rahul

+0

'if(!id.equals(other.id))return false;'爲什麼你更喜歡這種方式來返回id.equals(other.id);'? –

相關問題