为什么 HashSet 的内部实现会创建虚拟对象以作为值插入到 HashMap 中,而不是插入 null?
HashSet是使用HashMap实现的,当我们向HashSet添加任何说e1的东西时,如果e1不存在于HashSet中,它会在内部添加(e1,new Object())。我的问题是为什么他们插入新的Object(),而他们本可以像(e1,null)一样插入,这是更优化的方法,因为没有创建新的Object。在这里插入空值有什么缺点吗?
HashSet是使用HashMap实现的,当我们向HashSet添加任何说e1的东西时,如果e1不存在于HashSet中,它会在内部添加(e1,new Object())。我的问题是为什么他们插入新的Object(),而他们本可以像(e1,null)一样插入,这是更优化的方法,因为没有创建新的Object。在这里插入空值有什么缺点吗?
A 不会在每次新键进入地图时添加新密钥。它确实使用 ,但每次都使用相同的。此值在源代码中命名。HashSet
Object
put
Object
Object
PRESENT
HashSet
该方法调用内部 .该方法调用内部 ,但它必须返回 一个指示密钥是否存在的指示。如果 存储为值,则需要先调用,然后 ,以确定密钥是否存在 - 额外的开销。在这里,只有一个的内存开销 ,这是相当小的。add
put(key, PRESENT)
HashMap
remove
remove(key)
HashMap
boolean
null
HashSet
containsKey
remove
Object
我刚刚查看了源代码并看到了此代码
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
public boolean remove(Object o) {
return map.remove(o)==PRESENT;
}
如果使用 代替 ;在每种情况下,都需要一个额外的步骤。null
PRESENT