套实际上是作为地图实现的吗?

时间:2016-12-16 07:32:28

标签: java dictionary data-structures set

StackOverflow上的任何地方,我都看到了响应:

  

Set只是Map,但KeyValue。这就是为什么SetMap都不能重复,因为它违反了唯一的Key原则。

然后我看到(例如)Set根本不涉及Map。事实上,Map甚至不是Collections的一部分而Set。但对我来说,这没有意义,因为除了两个来自不同接口的事实之外,JDK中HashSet的实现很可能与HashMap的实现非常相似。

SetMap在这方面有什么关系?

enter image description here

2 个答案:

答案 0 :(得分:8)

SetMap接口不相关(返回keySet()的{​​{1}}接口的entrySet()Map方法除外由Set支持。

但是,有几个Map实现使用支持Set实现来存储其数据(Map的元素成为基础Set中的键,并且值为底层Map只是虚拟对象)。这适用于MapHashSet

Javadoc

中提到了这一点
  

公共类 HashSet
  扩展AbstractSet
  实现Set,Cloneable,Serializable

     

此类实现Set接口,由哈希表(实际上是HashMap实例)支持

And

  

公共类 TreeSet
  扩展AbstractSet
  实现NavigableSet,Cloneable,Serializable

     

基于TreeMap的 NavigableSet实现

答案 1 :(得分:2)

实际上Set接口没有Map或任何东西支持。但是,HashSet是使用Hashmap作为实际数据结构实现的。

javadoc

中没有说过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。