java - 为什么 HashSet 的内部实现会创建虚拟对象以作为值插入 HashMap 而不是插入空值?

标签 java hashmap hashset

HashSet 是使用 HashMap 实现的,当我们向 HashSet 添加任何东西,例如 e1 时,如果集合中不存在 e1,它会在内部向 HashMap 添加 (e1,new Object())。我的问题是为什么他们要插入 new Object(),而他们本可以像 (e1,null) 那样插入,这是更优化的方法,因为没有创建新的对象。在这里插入空值有什么缺点吗?

最佳答案

HashSet 不会在每次将新键放入 到映射中时添加新的Object。它确实使用了一个Object,但它每次都使用相同的Object。此值在 HashSet 源代码中被命名为 PRESENT

add 方法调用内部 HashMap 上的 put(key, PRESENT)remove 方法调用内部 HashMap 上的 remove(key),但它必须返回一个 boolean 来指示是否 key 在场。如果null作为值存储,那么HashSet需要先调用containsKey,然后调用remove,确定 key 是否存在——额外的开销。这里,只有一个Object的内存开销,非常小。

关于java - 为什么 HashSet 的内部实现会创建虚拟对象以作为值插入 HashMap 而不是插入空值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30037694/

相关文章:

java - 在正则表达式中使用通配符会导致扫描效率低下

java - 类加载器 : Delegation Hierarchy Algorithm

java - 如何在 Java 中使 future 依赖于另外两个

java - HashMap根据Size重新散列

java - 使用流收集 HashMap 中的事件

java - 需要澄清 Java 中的 HashSet 和重复项

java - 第 K 个最小数算法做额外的工作?

java - HashMap<String,HashMap<String,String>> 初始化时出现类型不匹配错误

java - 如何拆分分隔列表并将值重新组合成 HashMap ?

c# - 为修改所述集合的集合的每个元素调用方法的安全方法?