Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在HashSet的add方法中map.put(e,PRESENT)中有一个伪值?_Java - Fatal编程技术网

Java 为什么在HashSet的add方法中map.put(e,PRESENT)中有一个伪值?

Java 为什么在HashSet的add方法中map.put(e,PRESENT)中有一个伪值?,java,Java,当我们打电话时 HashSet set = new HashSet(); set.add(1); add方法将在内部调用带有值的map的put方法 map.put(1,当前) 为什么存在在map.put中作为伪值传递?因为在哈希集的实现中,使用映射来记住该集包含哪些值。或者,换言之,哪个值是存在的 因此,为了存储集合的值,每个值都作为键放入映射。由于键后面的值无关紧要,因此使用虚拟值。为了最小化内存占用,该虚拟值非常简单和小: private static final Object PRESE

当我们打电话时

HashSet set = new HashSet();
set.add(1);
add
方法将在内部调用带有值的map的
put
方法
map.put(1,当前)


为什么
存在
map.put
中作为伪值传递?

因为在
哈希集
的实现中,使用
映射
来记住该集包含哪些值。或者,换言之,哪个值是存在的

因此,为了存储
集合
的值,每个值都作为键放入
映射
。由于键后面的值无关紧要,因此使用虚拟值。为了最小化内存占用,该虚拟值非常简单和小:

private static final Object PRESENT = new Object(); //from HashSet's sourcecode

从概念上讲,映射表示集合的超集:它包含集合的所有键

因此,很有可能通过重用映射来实现集合。当然,地图需要一个键加上一个值


因此:当您决定通过重新使用映射来实现一个集合时,向该集合添加一个键会导致向该映射添加一个键和一个伪值。使用非空值是很有用的,这样您以后就可以决定删除特定键是否实际删除了任何内容。

如果您检查
哈希集的实例化:

public HashSet() {
        map = new HashMap<>();
    }
public HashSet(){
map=新的HashMap();
}

它被表示为一个
hashmap
,添加到集合中的值被添加为带有虚拟对象值的
key
,这就是
HashSet
避免重复的方法。映射需要一个值。无关:请阅读我感谢接受;-)与删除相同,添加时还可以获得关于是否已经存在值的信息(无需先执行
containsKey
)<代码>映射。如果之前未添加(因此对于
集合
添加
成功),则放置(e,存在)
将为
,或者如果之前添加了
添加
失败,则放置(e,存在)
。此外,我假设,每当有人选择向
哈希集添加
null
元素时,使用
key
将是一个坏主意,这与使用
null
@GhostCat时已经提到的陷阱相同。我理解它应该是非null值,但为什么要将PRESENT传递到那里,关键字可以是任何内容,而不是当前内容。