java - Java 中哈希表的单独链接

标签 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)); //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() index.
  2. Java 是否仅将单独的链接用于冲突处理?
  3. 如果我不能使用链接(正如我在上面尝试过的那样),请建议一个常用的方法。

最佳答案

Does Java use separate chaining only for collision handling?

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

听起来您可能想要一张多 map ,例如 Guava 中的其中一张。 .然后,您可以向多重映射询问与特定键关联的所有值。

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

// 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 - Java 中哈希表的单独链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24349379/

相关文章:

java - 制作哈希函数的最佳方法

java - 为什么直接内存 'array' 的清除速度比普通的 Java 数组要慢?

hash - 为什么java hashCode()中经常使用XOR,而其他按位运算符却很少使用?

java - 我正在使用 .hashCode() 创建哈希值。 Java 中是否有一个库可以执行双重哈希来解决冲突?

java - Java中字节数组的哈希

ruby - 是否可以使用范围作为 Ruby 中散列的键?

php - 哈希冲突的担忧

java - int 基本类型的 volatile 声明

java - Spring AMQP 异常

java - Struts 2 session 超时