如何HashMap在内部区分null和0是关键。
根据这篇文章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)
如果是,那么两者都应该放在索引 0 处的同一个存储桶中...
正确的。
并且应该有一个值
HashMap
不正确。这两个键将有一个单独的条目。这是由Map和HashMap规范保证的;即javadoc说每个不同的键都有一个单独的条目。需要实施满足规范……而且确实如此。
在 Java 8 之前,处理冲突的方法HashMap是将散列到同一存储桶的所有条目链接在一起。该HashMap.get(key)逻辑将迭代相关存储桶的链,寻找与键匹配的条目。(在您的示例代码中,链中将有单独的null条目Integer(0)键的单独条目。)
在 Java 8 中,它的工作方式一开始是相同的,但是针对键全部实现Comparable且链太长的情况进行了优化。在这种情况下,长链被转换为二叉树……这样O(N)链扫描就变成了O(logN)树搜索。
| 归档时间: |
|
| 查看次数: |
3235 次 |
| 最近记录: |