在 Java 中创建哈希表(或关联数组...)的最直接方法是什么?我的 google-fu 出现了几个例子,但是有标准的方法吗?
有没有一种方法可以用键-> 值对列表填充表,而无需为每一对单独调用对象的 add 方法?
Map map = new HashMap();
Hashtable ht = new Hashtable();
这两个类都可以从 java.util 包中找到。下面的jGuru FAQ entry解释了 2 之间的区别。
您可以使用双括号来设置数据。您仍然调用 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);
}};
另外不要忘记 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);
import java.util.HashMap;
Map map = new HashMap();
埃德蒙说的。
至于不一直调用 .add ,不,不是惯用的。如果你真的想要的话,你可以做各种各样的黑客攻击(将它存储在一个数组中然后循环),但我不推荐它。
有没有一种方法可以用键-> 值对列表填充表,而无需为每一对单独调用对象的 add 方法?
你的问题的一个问题是你没有提到你的数据一开始是什么形式的。如果您的对列表恰好是 Map.Entry 对象的列表,那将非常容易。
只是把它扔掉,有一个名为 java.util.Properties 的(备受诟病的)类,它是 Hashtable 的扩展。它只需要字符串键和值,并允许您使用文件或流加载和存储数据。它读写的文件格式如下:
key1=value1
key2=value2
我不知道这是否是您正在寻找的,但在某些情况下这可能很有用。
需要注意的是,Java 的散列函数不是最优的。如果您希望减少冲突并几乎完全消除约 50% 容量的重新散列,我会使用 Buz Hash 算法Buz Hash
Java 的散列算法弱的原因最明显的是它如何散列字符串。
"a".hash()
给你"a"
-的 ASCII 表示97
,所以"b"
是98
. 散列的全部意义在于分配一个任意且“尽可能随机”的数字。
如果您需要一个快速而肮脏的哈希表,请务必使用java.util
. 如果您正在寻找更具可扩展性的强大功能,我会考虑实施您自己的。
Hashtable<Object, Double> hashTable = new Hashtable<>();
把价值观 ...
获得最大值
Optional<Double> optionalMax = hashTable.values().stream().max(Comparator.naturalOrder());
if (optionalMax.isPresent())
System.out.println(optionalMax.get());