如何在Java中创建哈希表?

在Java中创建哈希表(或关联数组…)最直接的方法是什么? 我的google-fu已经出现了几个例子,但是有没有标准的方法来做到这一点?

有没有办法用键 – >值对列表填充表,而无需在每个对的对象上单独调用add方法?

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

这两个类都可以从java.util包中找到。 以下jGuru FAQ条目中解释了2之间的区别。

您可以使用双括号来设置数据。 你仍然可以调用add或者put,但它不那么难看:

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

另外,不要忘记Map和Hashtable在Java 5及更高版本中都是通用的(与Collections框架中的任何其他类一样)。

 Map numbers = new HashMap(); numbers.put("one", 1); numbers.put("two", 2); numbers.put("three", 3); Integer one = numbers.get("one"); Assert.assertEquals(1, one); 
 import java.util.HashMap; Map map = new HashMap(); 

埃德蒙说的话。

至于不是一直打电话给.add,不是,不是惯用的。 会有各种黑客(将它存储在数组然后循环中),如果你真的想要,你可以做,但我不推荐它。

有没有办法用键 – >值对列表填充表,而无需在每个对的对象上单独调用add方法?

您的问题的一个问题是,您没有提到您的数据开头的forms。 如果您的对列表恰好是Map.Entry对象的列表,那将非常简单。

只是抛出这个,有一个名为java.util.Properties的(备受诟病的)类,它是Hashtable的扩展。 它只需要String键和值,并允许您使用文件或流加载和存储数据。 它读写的文件格式如下:

 key1=value1 key2=value2 

我不知道这是否是您正在寻找的,但有些情况下这可能是有用的。

值得注意的是,Java的哈希函数不是最优的。 如果你想减少碰撞并几乎完全消除~50%容量的重新散列,我会使用Buz Hash算法Buz Hash

Java的散列算法很弱的原因在于它如何散列字符串最为明显。

"a".hash()给你ASCII表示"a"97 ,所以"b"将是98 。 散列的重点是分配任意和“尽可能随机”的数字。

如果您需要快速而脏的哈希表,请java.util使用java.util 。 如果您正在寻找更具可扩展性的强大function,我会考虑实现您自己的function。