java - 值未从 put() 插入到 HashMap 中

标签 java hashmap

考虑以下代码片段:

public class MainClass {

public static void main(String[] arg)       {
    Map<String, Object> map = new HashMap<>();

    map.put("ONE", new BigInteger("1"));
    map.put("TWO", new BigInteger("2"));
    map.put("THREE", new BigInteger("3"));
    map.put("FOUR", new BigInteger("4"));
    map.put("FIVE", new BigInteger("5"));
    map.put("SIX", new BigInteger("6"));

    System.out.println("Hello !");
}

结果是:

  • map 的大小为 6。
  • map 的表格包含以下内容:

    [FIVE=5,
     SIX=6,
     ONE=1,
     TWO=2,
     THREE=3]
    

4 消失了。正如之前的评论所述,明智的做法是计算我的条目的 hashCode,以 map 的大小为模。它给出以下结果:

ONE : 0
TWO : 0
THREE : 1
FOUR : 2
FIVE : 3
SIX : 4

正如我们所见,考虑到 FOUR 与任何值的冲突,hashCode 并不表示任何内容。这也适用于 ConcurrentHashMapLinkedHashMap,所以我猜这是一个 HashMap 问题。

有人可以向我解释一下到底发生了什么吗?我对这个完全迷失了。

<小时/>

我正在合作:

  • eclipse NEON
  • JDK 8

最佳答案

HashMap 的内部表(实际上是一个简单的数组)并不存储值,而是存储一个类似列表的结构,其元素现在存储多个值。

HashMap 计算放入其中的键的哈希值。具有相同哈希码的不同键会进入相同的列表(在表数组中索引)。

查看HashMap.Node的源代码:

static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;
    ...
}

该列表中的每个节点都存储键、值、哈希码以及指向该列表下一个节点的指针。

您的示例代码构建了下表:

 [2] FIVE = 5    =>   null
 [3] SIX = 6     =>   null
 [7] ONE = 1     =>   FOUR = 4   =>   null
[13] TWO = 2     =>   null
[15] THREE = 3   =>   null

顺便说一下......打印整个 map 会产生以下结果:

{FIVE=5, SIX=6, ONE=1, FOUR=4, TWO=2, THREE=3}

关于java - 值未从 put() 插入到 HashMap 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48742051/

相关文章:

java - 从 Gradle 添加 URL 到 BuildConfig 文件

java - 算法打印字符串的长度而不是其中 C 和 G 的数量

java - 如何访问未知的类方法

java - Clojure : java interop, 为什么这段代码不起作用?

java - 如何从 Java 中的 map 列表中获取所有值?

java - 如何在重建时不丢失本地 GAE 数据存储中的数据

java - Spring Data Rest——如何建立关联关系

java - Springboot在带参数的构造函数上使用@Autowired

Java Streams - 分组并返回嵌套映射

java - 在 Java 中访问深度嵌套的 HashMap