在Java中创建哈希表(或关联数组...)的最简单方法是什么?我的google-fu已经出现了几个例子,但是有一种标准的方法吗?
有没有办法用一个key->值对列表填充表,而无需在每个对的对象上单独调用add方法?
答案 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());