【发布时间】:2015-07-14 06:50:47
【问题描述】:
HashSet 是使用 HashMap 实现的,当我们向 HashSet 添加任何内容时,例如 e1,如果 e1 不存在于集合中,它会在内部添加 (e1,new Object()) 到 HashMap 中。我的问题是他们为什么要插入新的对象(),而他们本来可以像(e1,null)一样插入,这是更优化的方法,因为没有创建新的对象。在这里插入空值有什么缺点吗?
【问题讨论】:
-
它不添加新对象。它添加了一个单独的值,用作集合中是否存在值的指示符。阅读源代码。
-
在 Java 8 中,他们将其更改为 private static final Object PRESENT = new Object(); ,这是值。
-
没有性能影响,因为对象是静态最终的,所以它只是一个常量,它将作为虚拟值工作
-
你也可以在这里得到答案:stackoverflow.com/questions/12829163/…
-
@Sandeep 单个
PRESENT对象被用作HashSet的内部HashMap的值,至少可以追溯到Java 5。