题
在 Java 中创建哈希表(或关联数组...)最直接的方法是什么?我的 google-fu 已经出现了几个例子,但是有一个标准的方法来做到这一点吗?
有没有一种方法可以用键->值对列表填充表,而无需为每对对象单独调用 add 方法?
解决方案
Map map = new HashMap();
Hashtable ht = new Hashtable();
这两个类都可以从 java.util 包中找到。2者的区别解释如下 jGuru 常见问题解答入口.
其他提示
您可以使用双括号来设置数据。您仍然可以调用 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 及更高版本中都是通用的(就像 Java 中的任何其他类一样) 馆藏框架).
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 哈希算法 布兹哈希
Java 的哈希算法较弱的原因最明显的是它对字符串进行哈希处理的方式。
"a".hash()
给你 ASCII 表示 "a"
- 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());