为什么我的HashTable不允许键碰撞?

时间:2011-08-20 04:27:29

标签: java hashtable hash-collision

我读到HashTable可以将同一个键映射到多个值。这就是碰撞。

现在我运行这样的程序:

Dictionary<String,String> hTable = new Hashtable<String,String>();
hTable.put("a", "aa");
hTable.put("a", "ab");
System.out.println(""+hTable.get("a"));

我的想法是我应该aaab

但实际输出为ab

为什么会这样?那么碰撞在哪里?

5 个答案:

答案 0 :(得分:3)

没有碰撞。 HashTable条目将键映射到只有一个值。

样本中的第三行:

hTable.put("a", "ab");

aaa的映射替换为从aab的映射。

在完成执行后的四行代码后,hTable只有一个映射:aab

答案 1 :(得分:3)

碰撞只发生在内部。对于用户已解决透明。

这就是为什么哈希表可以是字典 - 它将每个键映射到恰好1个值。如果它映射到多于1个值,那么它就不是字典。

答案 2 :(得分:2)

Hashtable不会将同一个键映射到多个值。碰撞是多个键可能映射到相同的哈希值。它由数据结构本身解决,对您来说是透明的。

如果你想通过hTable.get(“a”)获得aa和ab,你需要创建Dictionary<String,List<String>>并在列表中附加相同键的值。

在您的代码中

hTable.put("a", "aa");
hTable.put("a", "ab");

钥匙是一样的。所以第二个操作使用“ab”来覆盖“aa”。这就是为什么你只得到“ab”。

答案 3 :(得分:2)

HashTable是关键 - &gt;价值映射。这意味着您不能拥有多个值来获得更多的一个键。您需要组合两个数据结构,将多个值与一个键存储在一起。

例如, 您可以在您的HashTable中放置一个linkList。例如

HashTable<String,LinkedList<String>> table = new HashTable();
LinkedList<String> list = new LinkedList();
list.add("aa");
list.add("ab");
table.add("a",list);

现在你可以这样做 aa ab 值;

table.get("a").get(0); // returns aa
table.get("a").get(1); // returns ab

我强烈建议您学习数据结构和算法的基础知识。

答案 4 :(得分:1)

您想要按键检索值。数组用于此目的但仅限于使用整数键并且可能使用太多空间(考虑仅在位置0和1000存储值,您必须为2个元素分配整个数组)。

HashTables解决了这两个问题:

  • 一个分散的非内射函数,它以固定长度的字节数组转换可变长度的字节数组。这意味着您有散列(bytes_1)==散列(bytes_2),但它不会经常发生 ,如果bytes_1~bytes_2散列不同;
  • 二手哈希的索引。如果函数返回10个字节的数组,则有2 ^ 80种可能性,因此您需要保留已经遇到的哈希的排序列表;
  • 一系列链接列表。散列索引将散列映射到数组中的位置。

冲突意味着两个密钥具有相同的哈希:map.put("key1", "value1"); map.put("key2", "value2") key1和key2可能会在同一个链表中结束。