如何在Java中创建哈希表?

时间:2008-08-27 01:32:15

标签: java hash hashmap

在Java中创建哈希表(或关联数组...)的最简单方法是什么?我的google-fu已经出现了几个例子,但是有一种标准的方法吗?

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

8 个答案:

答案 0 :(得分:25)

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

可以从java.util包中找到这两个类。以下jGuru FAQ entry解释了2之间的差异。

答案 1 :(得分:22)

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

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);
 }};

答案 2 :(得分: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);

答案 3 :(得分:2)

import java.util.HashMap;

Map map = new HashMap();

答案 4 :(得分:1)

Edmund说了什么。

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

答案 5 :(得分:0)

  

有没有办法用一个key-&gt;值对列表填充表,而无需在每个对的对象上单独调用add方法?

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

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

key1=value1
key2=value2

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

答案 6 :(得分:0)

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

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

"a".hash()为您提供"a" - 97的ASCII表示,因此"b"将为98。散列的重点是分配任意和“尽可能随机”的数字。

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

答案 7 :(得分:-1)

Hashtable<Object, Double> hashTable = new Hashtable<>();

投入价值 ...

获得最高奖励

Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());

if (optionalMax.isPresent())
 System.out.println(optionalMax.get());