HashSet由HashMap支持.从JavaDoc:
This class implements the Set interface, backed by a hash table
(actually a HashMap instance)
在查看源代码时,我们还可以看到它们之间的关系:
// Dummy value to associate with an Object in the backing Map
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}
因此,HashSet< E>由HashMap< E,Object>支持.对于我们应用程序中的所有HashSet,我们都有一个引用对象PRESENT,我们在HashMap中使用该值.尽管存储PRESENT所需的内存可以忽略,但是我们仍然为映射中的每个值存储对其的引用.
使用null代替PRESENT会更有效吗?然后,如果情况允许使用Map而不是Set,那么我们应该完全放弃HashSet并直接使用HashMap.
我引发这些想法的基本问题是以下情况:我具有以下属性的对象集合:
>大量的对象> 30’000
>插入顺序不相关
>高效检查是否包含物品
>将新项目添加到集合中不相关
所选解决方案应在上下文中对上述标准执行最佳操作,并最大程度地减少内存消耗.在此基础上,我们想到了数据结构HashSet和HashMap.在考虑替代方法时,关键问题是:
How to check containement efficiently?
我想到的唯一答案是使用items哈希计算存储位置.我可能在这里错过了一些东西.还有其他方法吗?
我看了各种问题,确实弄清了这个问题,但没有悄悄回答我的问题:
我不是在寻求任何替代库或框架的建议来解决此问题,但我想了解是否还有其他方法可以考虑对Collection中的元素进行有效的包含检查.