繁体   English   中英

如何在Java中创建哈希表?

[英]How do I create a hash table in Java?

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

有没有办法用键 - >值对列表填充表,而无需在每个对的对象上单独调用add方法?

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

这两个类都可以从java.util包中找到。 以下jGuru FAQ条目中解释了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,不,不是惯用。 如果你真的想要,你可以做各种黑客(将它存储在数组中然后循环),但我不推荐它。

值得注意的是,Java的哈希函数不是最优的。 如果你想减少碰撞并几乎完全消除~50%容量的重新散列,我会使用Buz Hash算法Buz Hash

Java的散列算法很弱的原因在于它如何散列字符串最为明显。

"a".hash()给你ASCII表示"a" - 97 ,所以"b"将是98 散列的重点是分配任意和“尽可能随机”的数字。

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

有没有办法用键 - >值对列表填充表,而无需在每个对的对象上单独调用add方法?

您的问题的一个问题是,您没有提到数据开头的形式。 如果您的对列表碰巧是Map.Entry对象的列表,那将非常简单。

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

key1=value1
key2=value2

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

Hashtable<Object, Double> hashTable = new Hashtable<>();

把价值 ......

得到最大

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

if (optionalMax.isPresent())
 System.out.println(optionalMax.get());

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM