考虑以下代码片段:
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
不会表示任何内容。这也适用于ConcurrentHashMap
和LinkedHashMap
,所以我想这是一个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/