12

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

有没有一种方法可以用键-> 值对列表填充表,而无需为每一对单独调用对象的 add 方法?

4

8 回答 8

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

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

于 2008-08-27T01:40:43.020 回答
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);
 }};
于 2008-08-28T07:34:55.953 回答
7

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

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);
于 2008-08-27T02:07:29.303 回答
2
import java.util.HashMap;

Map map = new HashMap();
于 2008-08-27T01:38:38.453 回答
1

埃德蒙的。

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

于 2008-08-27T01:45:32.307 回答
0

有没有一种方法可以用键-> 值对列表填充表,而无需为每一对单独调用对象的 add 方法?

你的问题的一个问题是你没有提到你的数据一开始是什么形式的。如果您的对列表恰好是 Map.Entry 对象的列表,那将非常容易。

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

key1=value1
key2=value2

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

于 2008-08-27T15:15:37.570 回答
0

需要注意的是,Java 的散列函数不是最优的。如果您希望减少冲突并几乎完全消除约 50% 容量的重新散列,我会使用 Buz Hash 算法Buz Hash

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

"a".hash()给你"a"-的 ASCII 表示97,所以"b"98. 散列的全部意义在于分配一个任意且“尽可能随机”的数字。

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

于 2012-10-26T02:57:06.930 回答
-1
Hashtable<Object, Double> hashTable = new Hashtable<>();

把价值观 ...

获得最大值

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

if (optionalMax.isPresent())
 System.out.println(optionalMax.get());
于 2019-05-03T09:06:38.593 回答