2012-01-13 68 views
-3

我有關於java equals和hashcode的聲明。這個聲明對重寫hashcode和equals有什麼意義?

如果我們用這樣一個Integer對象HashMap中的關鍵,我們將不能夠可靠地檢索相關值

這是什麼意思?爲什麼它說'不可靠'?我寫了一個測試程序,它總是有效的。

public class Test1 { 

    public static void main(String[] args){ 
     Map<Integer, Student> map = new HashMap<Integer, Student>(); 

     map.put(1, new Student("john"));   
     map.put(2, new Student("peter")); 

     Student s1 = map.get(1); 
     Student s2 = map.get(1); 
     Student s3 = map.get(2); 
     System.out.println("s1:"+s1+" s2:"+s2+" s3:"+s3); 

     System.out.println(s1==s2); 
     System.out.println(s1==s3); 
     System.out.println(s1.equals(s3)); 
     System.out.println(s1.equals(s2)); 
    } 
} 

class Student{ 
    private String name; 
    public Student(String name){   
     this.name = name;  
    } 

    public String getName(){ 
     return this.name; 
    } 
} 
+6

您需要引用更多 – hvgotcodes 2012-01-13 15:17:33

+0

這樣一個Integer對象嗎?哪一個??? – edutesoy 2012-01-13 15:18:24

+1

這個陳述來自哪裏?什麼是完整的上下文? – weekens 2012-01-13 15:18:41

回答

12

您誤會了!閱讀整個款:

會發生如果整數沒有覆蓋equals()和hashCode()? 沒有,如果我們從來沒有使用Integer作爲HashMap或其他基於散列的集合中的鍵。但是,如果我們要在HashMap中使用一個整數對象作爲關鍵字,我們將無法可靠地 檢索相關值,除非我們在get()調用中使用了完全相同的Integer 實例在put()調用中。

http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html

這是說,Integer類必須有一個hashCode()方法和equals()爲了工作。它確實有這些方法,所以沒關係。它會工作。

該示例說,不應該比較對存儲值的對象的引用,因爲具有相同整數值的兩個Integers實際上可能是不同的對象。

Integer x = new Integer(5); 
Integer y = new Integer(5); 

x.equals(y)總是如此。 x == y並非總是如此(但有時可能)。規則會根據不同的價值範圍而變化。除非您完全確定自己知道自己在做什麼,否則絕對不要依賴==作爲參考。

另外請注意,您通過int參數(原始類型)不是Integers(引用對象),但您的集合的通用類型是Integer。這意味着也有拳擊投入到等式中!

+0

+1爲研究! – fge 2012-01-13 15:20:02

+1

+1:嘆氣。閱讀:開發人員最重要的技能。 – 2012-01-13 15:22:38

+0

這是一個天真的問題。 – Joe 2012-01-13 15:24:07

2

full context of the quote

如果整數沒有重寫equals()和hashCode()會發生什麼? 沒有,如果我們從來沒有使用Integer作爲HashMap或其他基於散列的集合中的鍵。但是,如果我們要在HashMap中使用一個整數對象作爲關鍵字,我們將無法可靠地 檢索相關值,除非我們在get()調用中使用了完全相同的Integer 實例在put()調用中。

Java中的默認相等性測試是嚴格的實例相等性測試(即,當且僅當var1var2指向內存中的相同對象時,var1var2相等。但是,如果您使用Integer作爲Map的關鍵字,那麼您可能需要將代表的實際號碼作爲關鍵字(而不是Integer實例本身),這與此嚴格相等性測試不兼容。因此,Integer必須覆蓋hashCodeequals才能完成此工作(它的工作)。

+0

注意:Integer會覆蓋hashCode並且等於正確。 – jjmontes 2012-01-13 15:22:17

0

您的問題缺少一些信息。

你在說什麼是具體的.hashcode().equals()合同。他們需要遵循某些特性才能使它們正確,從而可以被依賴它們的其他類使用(Java Collections廣泛使用了.hashcode().equals())。

這裏很好地解釋了:http://www.technofundo.com/tech/java/equalhash.html

「Effective Java」一書對這些方法也有非常好的提示。

相關問題