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/