当我们打电话
HashSet set = new HashSet();
set.add(1);
add
方法将在内部使用值调用map的put
方法
map.put(1,PRESENT);
。
为什么PRESENT
在map.put
中作为伪值传递?
答案 0 :(得分:4)
从概念上讲,映射表示集合的超集:它包含集合的所有键。
因此,很可能通过重用Map来实现Set。但是,当然,地图需要键加一个值。
所以:当您决定通过重用Map来实现Set时,向该set中添加一个键会导致向该map中添加一个key和一个哑数值。并且使用非null值很有用,这样您以后就可以决定删除特定键是否实际上删除了任何内容。
答案 1 :(得分:0)
由于在HashSet
的实现中,使用Map
来记住集合包含哪些值。或者,换句话说,该值为 present 。
因此,为了存储Set
的值,每个值都作为键放入Map
中。由于键后面的值无关紧要,因此使用伪值。该伪值非常简单且很小,以便最大程度地减少内存占用:
private static final Object PRESENT = new Object(); //from HashSet's sourcecode
答案 2 :(得分:0)
如果您检查HashSet
的实例:
public HashSet() {
map = new HashMap<>();
}
它表示为hashmap
,您添加到集合中的值将作为keys
添加到具有伪对象值的地图中,这就是HashSet
避免重复的方式