当我们打电话HashSet set = new HashSet();
set.add(1);该add方法将在内部调用put带有 value 的 map 方法 map.put(1,PRESENT);。为什么PRESENT在中作为虚拟值传递map.put?
3 回答

森栏
TA贡献1810条经验 获得超5个赞
从概念上讲,Map 代表 Set 的超集:它包含 Set 的所有键。
因此,很可能通过重新使用 Map 来实现 Set。但是 Map 当然需要一个键加上一个值。
因此:当您决定通过重新使用 Map 来实现 Set 时,向 set 添加一个键会导致向该 map 添加一个键和一个虚拟值。使用非空值很有用,这样您可以稍后决定删除特定键是否真的删除了任何内容。

哔哔one
TA贡献1854条经验 获得超8个赞
如果您检查 a 的实例化HashSet
:
public HashSet() { map = new HashMap<>(); }
它表示为 a hashmap
,您添加到集合中的值被添加keys
到具有虚拟对象值的映射中,这就是HashSet
避免重复的方法

泛舟湖上清波郎朗
TA贡献1818条经验 获得超3个赞
因为在 的实现中HashSet
,aMap
用于记住集合包含哪些值。或者,换句话说,存在哪个值。
因此,为了存储的值,每个值都作为键Set
放入。Map
由于键后面的值无关紧要,因此使用了一个虚拟值。为了最小化内存占用,该虚拟值非常简单且很小:
private static final Object PRESENT = new Object(); //from HashSet's sourcecode
添加回答
举报
0/150
提交
取消