考虑以下代码片段:

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 !");
}


结果是:


地图的size为6。
地图的table包含以下内容:

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



FOUR消失了。如前所述,计算我的条目的hashCode以映射大小为模是明智的。它给出以下结果:

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


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

有人可以向我解释实际情况吗?我对这个很迷失。



我正在与:


日食霓虹灯
JDK 8

最佳答案

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


顺便说一句...打印整个地图将产生以下结果:

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

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

10-09 00:31