2012-12-08 112 views
5

我是Java新手,我想了解哈希表。我想插入對象到我的哈希表中,然後能夠從最後的哈希表中打印所有對象。我不確定我是否這樣做是正確的,因爲我讀過我需要重寫get()方法或hashCode()方法,但我不知道爲什麼。哈希表Java插入

我正在傳遞學生姓名的字符串對象。當我在插入後運行調試器時,它將密鑰顯示爲「null」,我的插入索引位於散列表中的隨機位置。防爆。 1,6,10

這就是我一直在添加的。任何人都可以告訴我,如果這是正確的,我真的需要重寫的東西?

在此先感謝!

CODE

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 
hashTable.put("Donald", "Trump"); 
hashTable.put("Mike", "Myers"); 
hashTable.put ("Jimmer", "Markus"); 
+0

這看起來不錯。你在調試器中看到的是支持數組的基本實現細節等等。除非你很好奇,否則你不會去看那個。 –

+0

@GregS感謝Greg的快速回復。如果我使用一個Student對象來插入而不僅僅是一個String對象,我是否必須重寫這些東西?你介意告訴我怎樣才能實現這樣的事情嗎?感謝你和每個人的幫助 –

回答

4

你做正確的事情。請記住,Hashtable不是直接訪問結構。例如,您不能「從Hashtable獲得第三個項目」。當你在談論Hashtable時,術語「索引」沒有實際意義:項目的數字索引毫無意義。

一個Hashtable保證將舉行鍵值對的你,在某種程度上,這將是非常快基於一個鍵結束一個值(例如:給Donald,你會得到Trump很快)。當然,必須滿足某些條件才能正常工作,但對於簡單的String-to-String示例,則可以。

你應該多瞭解一些哈希表,看看它們是如何在幕後工作的。

編輯(按照OP的要求):您正在詢問如何在您的Hashtable中存儲Student實例。正如我上面提到的,必須解決某些情況才能讓Hashtable正常工作。這些條件涉及部分,而不是部分。

如果您Student實例是,和一個簡單的字符串是關鍵,那麼有沒有什麼特別的爲你做,因爲String基本已經回答了所有的一個適當的哈希表密鑰所需的條件。

如果您Student實例是關鍵,那麼下面的條件必須滿足:

  1. 裏面Student,你必須重寫hashCode方法以這樣一種方式的hashCode後續調用將返回這裏相同的價值。換句話說,表達式x.hashCode() == x.hashCode()必須總是爲真。

  2. 裏面Student,你必須重寫equals方法以這樣一種方式,它只會在Student兩個相同的情況下返回true,並返回false否則。

這些條件足以使Student充當適當的Hashtable鍵。你可以通過編寫一個更好的hashCode實現來進一步優化事物(閱讀它......這裏輸入的時間很長),但只要你回答上述兩個問題,你就很好。

例子:

class Student { 
    private String name; 
    private String address; 

    public int hashCode() { 
     // Assuming 'name' and 'address' are not null, for simplification here. 

     return name.hashCode() + address.hashCode(); 
    } 

    public boolean equals (Object other) { 
     if (!(other instanceof Student) { 
      return false; 
     } 
     if (other == this) { 
      return true; 
     } 

     Student otherStudent = (Student) other; 
     return name.equals(otherStudent.name) && address.equals(otherStudent.address); 
    } 
} 
+0

對不起,最後一個問題...因爲我壓倒一切,不需要使用「@」嗎?再次感謝! –

+1

是的,你可以使用'@ Override'。實際上建議你這樣做。我只是在這裏簡化。 – Isaac

0

試試這個代碼:

Hashtable<String,String> hashTable=new Hashtable<String,String>(); 

hashTable.put("Donald", "16 years old"); 
hashTable.put("Mike", "20 years old"); 
hashTable.put ("Jimmer", "18 years old"); 

Enumeration studentsNames; 
String str; 


// Show all students in hash table. 
studentsNames = hashTable.keys(); 
while(studentsNames.hasMoreElements()) { 
str = (String) studentsNames.nextElement(); 
txt.append("\n"+str + ": " + hashTable.get(str)); 
}