以 null 为键的 HashMap

Bra*_*raj 4 java hashmap

如何HashMap在内部区分null0是关键。

根据这篇文章null,密钥的哈希码是0,它是否正确?如果是,那么两者都应该在索引处位于同一个存储桶中0,并且其中应该有一个值,HashMap但这不是如何HashMap工作方式。

有人能给我解释一下吗?null输入的哈希码是什么HashMap

示例代码:

HashMap<Integer,String> map=new HashMap<Integer,String>();
map.put(null, "abc");
map.put(0, "xyz"); // will it override the value for null as key?

System.out.println(map.get(null));  // abc
System.out.println(map.get(0));     // xyz
Run Code Online (Sandbox Code Playgroud)

Ste*_*n C 5

如果是,那么两者都应该放在索引 0 处的同一个存储桶中...

正确的。

并且应该有一个值HashMap

不正确。这两个键将有一个单独的条目。这是由MapHashMap规范保证的;即javadoc每个不同的键都有一个单独的条目。需要实施满足规范……而且确实如此。

在 Java 8 之前,处理冲突的方法HashMap是将散列到同一存储桶的所有条目链接在一起。该HashMap.get(key)逻辑将迭代相关存储桶的链,寻找与键匹配的条目。(在您的示例代码中,链中将有单独的null条目Integer(0)键的单独条目。)

在 Java 8 中,它的工作方式一开始是相同的,但是针对键全部实现Comparable且链太长的情况进行了优化。在这种情况下,长链被转换为二叉树……这样O(N)链扫描就变成了O(logN)树搜索。