2008-08-27 111 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。如果你正在寻找更具可扩展性的健壮的东西,我会考虑实现你自己的。