2013-10-29 28 views
0

我正在嘗試下面的一段代碼。java中的地圖和自定義對象

class dog{ 
    private String name; 
    public dog(String n){ 
     name = n; 
    } 
    public String getname(){ return name; } 
    public void setname(String n){ name =n;} 
    public boolean equals(Object o){ 
     //if ((o instanceof dog)&& (((dog)o).name == name)) return true; 
     if ((o instanceof dog)&& (((dog)o).name.equals(name))) return true; 
     else return false; 
    } 

    public int hashcode(){ 
     return name.length(); 
    } 
    public String toString(){ 
     return "Name:"+name; 
    } 
} 

這是我的狗課。現在在Main方法中,我試圖執行以下操作:

Map<Object,Object> m = new HashMap <Object, Object>(); 

dog p = new dog("GM"); 
dog q = new dog ("GM"); 
System.out.println(p.equals(q)); 
m.put (new dog("GM"),"K2"); 

System.out.println(m.get(new dog("GM"))); 

我得到一個真值和一個空值。我期待K2而不是null。有人能幫我解決這個問題嗎?我重寫了hashcode和equals方法。我錯過了什麼?

編輯: - 改變了等於函數。相同的結果。

+0

等值方法中的狗類中的字符串值比較不正確。 – MouseLearnJava

+0

你用過(((dog)o).name == name))。實際上,它應該使用(((dog)o).name.equals(name)。請先改變它,然後再進一步檢查。 – MouseLearnJava

+0

改變你的hashCode返回'name.hashCode()'而不是'name.length )',你正在使用其中的一個哈希函數,它不會返回負數,並且它很少使用大數字。 –

回答

3

眼前的問題是,hashCode需要一個資本C,你正在實施hashcode與小寫c

((dog)o).name == name比較字符串的身份。這意味着如果您有兩個字符串"GM"的實例,它們將相互爲.equals(),但不是==

+0

感謝輸入,但是p.equals(q)返回true。這意味着等於方法正常工作,不是嗎?在字符串的情況下,我認爲這是很好的,如果錯了,請糾正我的錯誤 實際上也嘗試過了,即使我使用等於而不是== –

+0

你錯了,如果不是這樣的話串;事實上,它在字符串的情況下最容易讓人混淆。有時它起作用(查找「字符串實習」),有時它不會。顯然對你來說,它在'println'中工作,但如果它在地圖上工作,我們就不會進行這個討論。 – Kevin

+0

謝謝。我改變了方法。但是,我仍然得到一個零.. –