7

我想知道为什么HashSet在幕后使用HashMapTreeSet使用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变量,对吗?那么在内部使用地图对象的好处和主要原因是什么?

4

2 回答 2

11

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

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

于 2012-09-14T20:34:04.193 回答
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>());
于 2012-09-14T20:33:46.753 回答