如何在Java中创建哈希表?
在Java中创建哈希表(或关联数组...)最直接的方法是什么?我的谷歌已经出现了几个例子,但是有没有一个标准的方法来做到这一点?如何在Java中创建哈希表?
有没有一种方法来填充表中的键 - >值对列表,而不必在每个对的对象上单独调用add方法?
Map map = new HashMap();
Hashtable ht = new Hashtable();
这两个类可以从java.util包中找到。 2之间的差异在以下jGuru FAQ entry中解释。
import java.util.HashMap;
Map map = new HashMap();
另外不要忘记,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);
而且是有办法来填充键 - >值对的列表的表,而不单独地调用的每对在对象上附加方法?
你的问题的一个问题是你没有提到什么形式的数据是在开始。如果你的对的列表碰巧是一个Map.Entry对象的列表,它会很容易。
只是抛出这个问题,有一个名为java.util.Properties的(非常恶意的)类,它是Hashtable的扩展。它只需要字符串键和值,并允许您使用文件或流加载和存储数据。它读取和写入文件的格式如下:
key1=value1
key2=value2
我不知道这是不是你要找的东西,但有些情况下这可能是很有用的情况。
您可以使用双大括号来设置数据。您仍然呼吁添加或放,但它不那么难看:
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);
}};
重要的是要指出,Java的散列函数是不是最佳。如果你希望减少碰撞并且几乎完全消除〜50%容量的重新哈希,我会使用Buz哈希算法Buz Hash
Java哈希算法很弱的原因在于它如何哈希Strings。
"a".hash()
给你"a"
ASCII表示 - 97
,所以"b"
将98
。散列的重点是分配一个随机的和“尽可能随机”的数字。
如果您需要快速而脏的散列表,请使用java.util
。如果你正在寻找更具可扩展性的健壮的东西,我会考虑实现你自己的。
+1,你提到了Hashtable和HashMap。 – bgw 2011-05-17 02:02:57
来自jGuru条目:“两者之间的主要区别在于,对Hashtable的访问在桌面上是同步的,而对HashMap的访问不是。您可以添加它,但默认情况下不会。 另一个不同之处在于HashMap中的迭代器是安全的,而Hashtable的枚举器却不是,如果迭代时更改映射,就会知道。“ – ErikAGriffin 2015-10-26 10:13:00