【问题标题】:Display all the collisions in HashMap显示HashMap中的所有碰撞
【发布时间】:2014-09-30 18:04:45
【问题描述】:

我是 Java 中 HashMap 的新手。我正在尝试创建一种发生碰撞的情况,并且使用相同的键(在本例中为 1)。我读到 HashMap 中的值没有被覆盖,而是在链接列表中维护。如何显示键“1”的所有值?

    public static void main(String[] args)
    {
        HashMap<String, String> hash = new HashMap<String, String>();
        hash.put("1", "one");
        hash.put("1", "two");
        hash.put("1", "three");
        hash.put("1", "four");
        System.out.println(hash);
    }

以上代码的输出-

{1=two}

【问题讨论】:

标签: java hash hashmap hashtable


【解决方案1】:

这不是真的。每个唯一键的键值对只存储在映射中。您在映射中为特定键输入的最新值将覆盖为该键存储的先前值。

不同的键可能具有相同的哈希码,这导致它们存储在 HashMap 内部的同一个链表中,但映射中的键都是唯一的。对于映射中的每两个键,key1.equals(key2) 将返回 false,即使 key1.hashCode()==key2.hashCode() 也是如此。

【讨论】:

  • 那么,如果我必须存储“Ca”和“DB”(两者的哈希码值相同),我该怎么办? “Ca”和“DB”是键还是值?如果它们是值,那么关键是什么?
  • @user3554962 它们是键还是值取决于它们是传递给 put 方法的第一个参数还是第二个参数。如果它们是键,则它们都将与它们的值一起存储在哈希映射中,并且(就功能而言)它们具有相同的 hashCode 值并不重要。但是,如果许多键具有相同的 hashCode,您可能会遇到性能问题。
【解决方案2】:

Map javadoc 的前 2 行说明了一切。

public interface Map<K,V>

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

地图的 javadoc 可以在这里找到 - http://docs.oracle.com/javase/7/docs/api/java/util/Map.html

【讨论】:

  • 那么,如果我必须存储“Ca”和“DB”(两者的哈希码值相同),我该怎么办? “Ca”和“DB”是键还是值?如果它们是值,那么关键是什么?
  • 即使哈希码返回相同的值,"Ca".equals"DB" 也会失败,因此这些将被视为 2 个不同的键。价值观没有限制。 A 可能有 10 个不同的键,它们都具有相同的值
猜你喜欢
  • 1970-01-01
  • 2011-03-28
  • 2021-12-31
  • 1970-01-01
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多