2008-08-27 146 views
7

在Java中創建哈希表(或關聯數組...)最直接的方法是什麼?我的谷歌已經出現了幾個例子,但是有沒有一個標準的方法來做到這一點?如何在Java中創建哈希表?

有沒有一種方法來填充表中的鍵 - >值對列表,而不必在每個對的對象上單獨調用add方法?

回答

23
Map map = new HashMap(); 
Hashtable ht = new Hashtable(); 

這兩個類可以從java.util包中找到。 2之間的差異在以下jGuru FAQ entry中解釋。

+1

+1,你提到了Hashtable和HashMap。 – bgw 2011-05-17 02:02:57

+0

來自jGuru條目:「兩者之間的主要區別在於,對Hashtable的訪問在桌面上是同步的,而對HashMap的訪問不是。您可以添加它,但默認情況下不會。 另一個不同之處在於HashMap中的迭代器是安全的,而Hashtable的枚舉器卻不是,如果迭代時更改映射,就會知道。「 – ErikAGriffin 2015-10-26 10:13:00

2
import java.util.HashMap; 

Map map = new HashMap(); 
1

什麼Edmund說。

至於沒有調用.add所有的時間,沒有,沒有慣用。如果你真的想做的話,會有各種各樣的黑客(將它存儲在一個數組中,然後循環),但我不會推薦它。

7

另外不要忘記,Map和Hashtable在Java 5及更高版本中都是通用的(如在Collections framework中的任何其他類)。

Map<String, Integer> numbers = new HashMap<String, Integer>(); 
numbers.put("one", 1); 
numbers.put("two", 2); 
numbers.put("three", 3); 

Integer one = numbers.get("one"); 
Assert.assertEquals(1, one); 
0

而且是有辦法來填充鍵 - >值對的列表的表,而不單獨地調用的每對在對象上附加方法?

你的問題的一個問題是你沒有提到什麼形式的數據是在開始。如果你的對的列表碰巧是一個Map.Entry對象的列表,它會很容易。

只是拋出這個問題,有一個名爲java.util.Properties的(非常惡意的)類,它是Hashtable的擴展。它只需要字符串鍵和值,並允許您使用文件或流加載和存儲數據。它讀取和寫入文件的格式如下:

key1=value1 
key2=value2 

我不知道這是不是你要找的東西,但有些情況下這可能是很有用的情況。

19

您可以使用雙大括號來設置數據。您仍然呼籲添加或放,但它不那麼難看:

private static final Hashtable<String,Integer> MYHASH = new Hashtable<String,Integer>() {{ 
    put("foo",  1); 
    put("bar",  256); 
    put("data",  3); 
    put("moredata", 27); 
    put("hello", 32); 
    put("world", 65536); 
}}; 
0

重要的是要指出,Java的散列函數是不是最佳。如果你希望減少碰撞並且幾乎完全消除〜50%容量的重新哈希,我會使用Buz哈希算法Buz Hash

Java哈希算法很弱的原因在於它如何哈希Strings。

"a".hash()給你"a" ASCII表示 - 97,所以"b"98。散列的重點是分配一個隨機的和「儘可能隨機」的數字。

如果您需要快速而髒的散列表,請使用java.util。如果你正在尋找更具可擴展性的健壯的東西,我會考慮實現你自己的。