为什么 HashSet 的内部实现会创建虚拟对象以作为值插入到 HashMap 中,而不是插入 null?

2022-09-04 01:29:57

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


答案 1

A 不会在每次新键进入地图时添加新密钥。它确实使用 ,但每次都使用相同的。此值在源代码中命名。HashSetObjectputObjectObjectPRESENTHashSet

该方法调用内部 .该方法调用内部 ,但它必须返回 一个指示密钥是否存在的指示。如果 存储为值,则需要先调用,然后 ,以确定密钥是否存在 - 额外的开销。在这里,只有一个的内存开销 ,这是相当小的。addput(key, PRESENT)HashMapremoveremove(key)HashMapbooleannullHashSetcontainsKeyremoveObject


答案 2

我刚刚查看了源代码并看到了此代码

public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

public boolean remove(Object o) {
    return map.remove(o)==PRESENT;
}

如果使用 代替 ;在每种情况下,都需要一个额外的步骤。nullPRESENT