为什么HashSet中add方法的map.put(e,PRESENT)中的PRESENT是伪值?

时间:2019-07-05 09:52:46

标签: java

当我们打电话

HashSet set = new HashSet();
set.add(1);

add方法将在内部使用值调用map的put方法 map.put(1,PRESENT);

为什么PRESENTmap.put中作为伪值传递?

3 个答案:

答案 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避免重复的方式