Java中哈希表的单独链接

Java中哈希表的单独链接,java,hash,hash-collision,Java,Hash,Hash Collision,基于以下代码段: Hashtable balance = new Hashtable(); Enumeration names; String str; double bal; balance.put("Zara", new Double(3434.34)); //first entry for Zara balance.put("Mahnaz", new Double(123.22)); balance.put("Zara", new Double(1378.00

基于以下代码段:

  Hashtable balance = new Hashtable();
  Enumeration names;
  String str;
  double bal;

  balance.put("Zara", new Double(3434.34)); //first entry for Zara
  balance.put("Mahnaz", new Double(123.22));
  balance.put("Zara", new Double(1378.00)); //second entry for Zara
  balance.put("Daisy", new Double(99.22));
  balance.put("Qadir", new Double(-19.08));

  System.out.println(balance.entrySet());

为什么这里没有锁链?当我以Zara作为键重新输入时,旧值被覆盖。我希望它被添加到Zara.hashcode索引的链表末尾。 Java是否仅在冲突处理中使用单独的链接? 如果我不能像上面尝试的那样使用链接,请建议一种常用的方法。 Java是否仅在冲突处理中使用单独的链接

对。在Hashtable或HashMap中,每个键只能有一个条目,这可能是您应该与泛型一起使用的。这是一个键/值映射,而不是键/多值映射。在哈希表的上下文中,术语冲突通常用于两个不相等的键具有相同哈希代码的情况。它们仍然需要被视为不同的键,因此实现必须处理这一点。你现在的处境不是这样的

听起来您可能需要一个多重贴图,例如中的一个。然后,可以向多重映射请求与特定键关联的所有值

编辑:如果你想建立你自己的多重地图,你会有如下的东西:

// Warning: completely untested
public final class Multimap<K, V> {
    private final Map<K, List<V>> map = new HashMap<>();

    public void add(K key, V value) {
        List<V> list = map.get(key);
        if (list == null) {
            list = new ArrayList();
            map.put(key, list);
        }
        list.add(value);
    }

    public Iterable<V> getValues(K key) {
        List<V> list = map.get(key);
        return list == null ? Collections.<V>emptyList()
                            : Collections.unmodifiableList(list);
    }
}
Java是否仅在冲突处理中使用单独的链接

对。在Hashtable或HashMap中,每个键只能有一个条目,这可能是您应该与泛型一起使用的。这是一个键/值映射,而不是键/多值映射。在哈希表的上下文中,术语冲突通常用于两个不相等的键具有相同哈希代码的情况。它们仍然需要被视为不同的键,因此实现必须处理这一点。你现在的处境不是这样的

听起来您可能需要一个多重贴图,例如中的一个。然后,可以向多重映射请求与特定键关联的所有值

编辑:如果你想建立你自己的多重地图,你会有如下的东西:

// Warning: completely untested
public final class Multimap<K, V> {
    private final Map<K, List<V>> map = new HashMap<>();

    public void add(K key, V value) {
        List<V> list = map.get(key);
        if (list == null) {
            list = new ArrayList();
            map.put(key, list);
        }
        list.add(value);
    }

    public Iterable<V> getValues(K key) {
        List<V> list = map.get(key);
        return list == null ? Collections.<V>emptyList()
                            : Collections.unmodifiableList(list);
    }
}
Hashtable实现的引号:

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值

重点矿山

报告还说:

如果映射以前包含键的映射,则旧值将替换为指定值

因此,如果希望多个值与一个键关联,请使用映射而不是映射。Guava还有一个,它可以做你想做的事情,而不必像处理地图一样明确地处理列表。

引述Hashtable是其中的一个实现:

将键映射到值的对象。地图不能包含重复的键;每个键最多可以映射到一个值

重点矿山

报告还说:

如果映射以前包含键的映射,则旧值将替换为指定值



因此,如果希望多个值与一个键关联,请使用映射而不是映射。Guava还有一个,它可以做你想做的事情,而不必像处理地图一样明确地处理列表。

阅读Hashtable的文档,看看它是如何处理重复项的。首先不要使用Hashtable,其次使用像这样的泛型:HashMap1。你所说的不是锁链,2。是的,3.为什么我觉得你想把算法书中的HashTable与Java中的HashTable实现进行比较?@TheLostMind你的直觉是非常正确的阅读HashTable的文档,看看它如何处理重复项。首先不要使用HashTable,其次使用像这样的泛型:HashMap1。你所说的不是锁链,2。是的,3.为什么我觉得你在试图将算法书中的哈希表与Java中的哈希表实现进行比较?@尽管你的直觉非常正确,但冲突处理是如何发生的?如果同一个键再次被散列,我将丢失以前的数据@杜比:是的,如文件所述。哈希表中的冲突与具有相同哈希代码的两个不相等的键有关,而您只是得到了相同的键。。。在这一点上,前面的条目被替换,如文档所示。您能指出我如何才能在代码方面不丢失数据吗?我理解这一理论,但仍不知道如何着手实施it@Dubby:或者你可以创建自己的地图,上面有一个值列表,或者你可以使用类似Guava的Multimap。不清楚您尝试过什么或您的目标是什么。我试图做的是,如果我在示例Zara中为员工添加新工资,那么它应该存储所有以前的工资以及一个列表,而不是像现在这样覆盖它们。那么冲突处理是如何发生的?如果同一个键再次被散列,我将丢失以前的数据@杜比:是的,如文件所述。哈希表中的冲突与具有相同哈希代码的两个不相等的键有关,而您只是得到了相同的键。。。在这一点上,前面的条目被替换,如文档所示。您能指出我如何才能在代码方面不丢失数据吗?我明白你的意思
他坚持自己的理论,但仍不知如何着手实施it@Dubby:或者你可以创建自己的地图,上面有一个值列表,或者你可以使用类似Guava的Multimap。现在还不清楚你尝试过什么或者你的目标是什么。我想做的是,如果我在我的示例Zara中为一名员工添加了新的工资,那么它应该存储所有以前的工资以及一个列表,而不是像现在这样覆盖它们。