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传递到那里,关键字可以是任何内容,而不是当前内容。