StackOverflow上的任何地方,我都看到了响应:
Set
只是Map
,但Key
是Value
。这就是为什么Set
和Map
都不能重复,因为它违反了唯一的Key
原则。
然后我看到(例如)Set
根本不涉及Map
。事实上,Map
甚至不是Collections
的一部分而Set
。但对我来说,这没有意义,因为除了两个来自不同接口的事实之外,JDK中HashSet
的实现很可能与HashMap
的实现非常相似。
Set
和Map
在这方面有什么关系?
答案 0 :(得分:8)
Set
和Map
接口不相关(返回keySet()
的{{1}}接口的entrySet()
和Map
方法除外由Set
支持。
但是,有几个Map
实现使用支持Set
实现来存储其数据(Map
的元素成为基础Set
中的键,并且值为底层Map
只是虚拟对象)。这适用于Map
和HashSet
。
公共类 HashSet
扩展AbstractSet
实现Set,Cloneable,Serializable
此类实现Set接口,由哈希表(实际上是HashMap实例)支持。
And:
公共类 TreeSet
扩展AbstractSet
实现NavigableSet,Cloneable,Serializable基于TreeMap的 NavigableSet实现。
答案 1 :(得分:2)
实际上Set接口没有Map或任何东西支持。但是,HashSet是使用Hashmap作为实际数据结构实现的。
中没有说过Set不包含重复元素的集合。更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。正如其名称所暗示的,该界面模拟数学集抽象。
但是,根据javadoc,Hashset在内部使用HashMap来确保维护唯一数据。
此类实现Set接口,由哈希表(实际上是HashMap实例)支持。它不能保证集合的迭代顺序;特别是,它不保证订单会随着时间的推移保持不变。该类允许null元素。
它将Map中的Set值保持为键,而不是值。它为所有条目的值添加了相同的常量单个对象。
public boolean More ...add(E e) {
return map.put(e, PRESENT)==null;
}
这里,PRESENT是静态值虚拟对象,保留在背景Map中。
private static final Object PRESENT = new Object();
当我们调用HashSet的各种构造函数时,会创建Backing Map对象: -
public More ...HashSet() {
map = new HashMap<E,Object>();
}
public More ... HashSet(Collection c){ map = new HashMap(Math.max((int)(c.size()/ .75f)+ 1,16)); 的addAll(C); }
public More ... HashSet(int initialCapacity,float loadFactor){ map = new HashMap(initialCapacity,loadFactor); }
可以在此link
看到所有来源请参阅由Map支持的其他Set实现的javadoc。