2017-09-02 92 views
0

請解釋以下代碼的輸出。我猜它是空的,因爲命令行參數不同於它的鍵。但這不是正確的解釋。它是空的,因爲朋友類不會覆蓋equals和hashcode()方法。哈希圖得到方法

但是爲什麼?

import java.util.*; 
public class Birthdays { 
    public static void main(String[] args) { 
     Map<Friends, String> hm = new HashMap<Friends, String>(); 
     hm.put(new Friends("Charis"), "Summer 2009"); 
     hm.put(new Friends("Draumur"), "Spring 2002"); 
     Friends f = new Friends(args[0]); 
     System.out.println(hm.get(f)); 
    } 
} 

class Friends { 
    String name; 
    Friends(String n) { name = n; } 
} 

和命令行調用: java的生日Draumur

回答

1

args[0]將包含字符串"Draumur",所以這不是對程序進行打印null的原因。

A HashMap是一個散列表,它根據密鑰的散列值查找元素。如果您不覆蓋散列方法,Java將根據對象標識計算散列值,因此不會保證將兩個不同的Friends對象(即使在內部使用相同的name)散列爲相同的值。

您還需要編寫一個equals方法,因爲如果你不重寫,Java也將考慮兩種不同的Friends對象不相等,即使使用相同的name內。

總之,你需要重寫hashCode方法使HashMap可以找到Friends對象,你需要重寫equals方法使HashMap,當它發現它,可以看到,這是它是對象尋找。

這裏是Friends類的一個可能的新版本(和我也建議你把它Friend,因爲這樣的一個對象代表一個單身的朋友):

class Friends { 
    String name; 
    Friends(String n) { name = n; } 
    public boolean equals(Object o) { 
     if (!(o instanceof Friends)) 
      return false; 
     Friends rhs = (Friends)o; 
     return (name.equals(rhs.name)); 
    } 
    public int hashCode() { 
     return name.hashCode(); 
    } 
} 
0

地圖的get方法返回在key的值,其中地圖鍵「.equals」來研究的重點

您的朋友鍵不實現equals,所以默認一個從Object被使用,這是一個‘==’比較(真只有當它是相同的對象)。

Get只會給你一些東西,如果你使用完全相同的對象put作爲關鍵。

0

命令行參數比它的關鍵

不知道不同的我明白,邏輯...
args = {"Draumur"}
new Friends(args[0]) = new Friends("Dramur")

這樣一個關鍵放置在地圖上已經,但Friend不能通過散列碼與其他Friend對象進行比較,否則就無法與其他Friend對象進行比較。

如果您有String to String的HashMap,則get("Dramur")不會爲空。

+0

args [0] =「Dramur」或args [0] =「java」? – prity

+0

'java'是可執行文件。 '生日'是主要的類。其他一切都是'args' –