为什么Java中的Set数据结构在内部使用Map?

时间:2012-09-14 20:31:48

标签: java hashmap set hashset

我想知道为什么HashSet使用HashMapTreeSet使用TreeMapLinkedHashSet在场景后面内部使用LinkedHashMap?因为Set只携带和存储密钥但值,所以不使用额外的内存空间,如不经济?

Entry所拥有的HashMap内部类是以下

class Entry<K,V> implements Map.Entry<K,V> {
    final K key;
    V value;
    Entry<K,V> next;
    final int hash;
    ...
    ....
}

对于Set,我们真的不需要那个V value变量,对吗?那么内部使用地图对象的好处和主要原因是什么?

2 个答案:

答案 0 :(得分:11)

代码少,错误少,测试少。

通过重用相同的代码,您只需要优化,调试和测试一次。内存开销很小 - 每个条目的另一个指针,与Key相比可忽略不计。

答案 1 :(得分:3)

使用Map可以简化代码,但会略微增加内存使用量。它没有您想象的那么多,因为开销已经很高了。 ;)

并非所有地图都有套装,您可以使用以下内容。

Set<T> set = Collection.newSetFromMap(new ConcurrentHashMap<T>());
Set<T> set = Collection.newSetFromMap(new ConcurrentSkipListMap<T>());
Set<T> set = Collection.newSetFromMap(new IdentityHashMap<T>());