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