我想知道为什么HashSet使用HashMap
,TreeSet
使用TreeMap
,LinkedHashSet
在场景后面内部使用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
变量,对吗?那么内部使用地图对象的好处和主要原因是什么?
答案 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>());