我读到HashTable可以将同一个键映射到多个值。这就是碰撞。
现在我运行这样的程序:
Dictionary<String,String> hTable = new Hashtable<String,String>();
hTable.put("a", "aa");
hTable.put("a", "ab");
System.out.println(""+hTable.get("a"));
我的想法是我应该aa
和ab
。
但实际输出为ab
为什么会这样?那么碰撞在哪里?
答案 0 :(得分:3)
没有碰撞。 HashTable条目将键映射到只有一个值。
样本中的第三行:
hTable.put("a", "ab");
将a
到aa
的映射替换为从a
到ab
的映射。
在完成执行后的四行代码后,hTable
只有一个映射:a
到ab
。
答案 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解决了这两个问题:
冲突意味着两个密钥具有相同的哈希:map.put("key1", "value1"); map.put("key2", "value2")
key1和key2可能会在同一个链表中结束。