1

基于以下代码片段:

  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());

.

Output : [Qadir=-19.08, Mahnaz=123.22, Daisy=99.22, Zara=1378.0]
  1. 为什么这里没有发生链接?当我以 Zara 作为键重新输入时,旧值被覆盖。我希望它被添加到Zara".hashcode()索引的链接列表的末尾。
  2. Java 是否仅将单独的链接用于冲突处理?
  3. 如果我不能使用链接(正如我在上面尝试过的那样),请建议一种常用的方法。
4

2 回答 2

4

Java 是否仅将单独的链接用于冲突处理?

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

听起来您可能想要一张多地图,例如Guava中的一张。然后,您可以向 multimap 询问与特定键关联的所有值。

编辑:如果你想构建自己的多图,你会有类似的东西:

// 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);
    }
}
于 2014-06-22T08:15:36.980 回答
3

引用Map 的文档(Hashtable 是其实现):

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

(强调我的)

put()的文档还说:

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

因此,如果您想要与一个键关联的多个值,请使用 aMap<String, List<Double>>而不是 a Map<String, Double>。Guava 还有一个Multimap,它可以做你想做的事情,而不必像处理Map<String, List<Double>>.

于 2014-06-22T08:18:07.383 回答