事实
- hashMap 的基本数据结构是
Entry[](条目是一种LinkedList)。
- 用于定位此数组中位置的键的哈希码
- 一旦条目使用哈希码重试,然后 Key 的 Equal 用于选择正确的条目(通过迭代 hasNext)
- 默认哈希码为该实例返回唯一的整数值。
你同意评论部分
"Is it possible that you'll store an object using one key,
and then try to retrieve it using a key which is an identical object,
but not the same object"
即使两个键具有相同的值,实例也不同。那么根据合同(事实 4),您可能对两个密钥都有不同的哈希码。因此,您将在数组中具有不同的位置(规则 2)
map.put(new key(1),"first element");
此处的 key Object 不会被覆盖,因此它将为每个实例返回 unquie 哈希码。 (为了避免过于复杂,假设哈希码返回为 000025 。所以 Entry[25] 是“第一个元素”)
map.get(新键(1))
现在这个新键可能会返回哈希码值000017,所以它会尝试从Entry[17]中获取值并返回null(不例外)。
注意,为了简单起见,我只给出了 000025 和 000017 的示例,实际上 hashmap 会重新访问 hashcode 并根据数组大小进行更改
到目前为止,我们还没有讨论过 Key 是 Mutable 还是 Immutable 的天气。不管键是可变的还是不可变的
If you store an object using one key,and then try to retrieve it using a key
which is an identical object,but not the same object
您需要覆盖哈希码并确保它返回相同的 Integer ,以便它找到相同的存储桶(数组中的位置)并获取元素。同样适用于从 Entry 中获取正确元素的 equals