如果您仔细观察,您会发现它实际上在 HashSet 上使用了一些受保护的构造函数,这些构造函数只是为它而存在的,而不是常规构造函数。例如,
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
因此,用于支持 LinkedHashSet 的 keySet 实际上来自 LinkedHashMap 的实现,而不是像常规 HashSet 那样的常规 HashMap。它实际上并不使用 java.util.LinkedList。它只是维护在桶内容的实现中形成列表的指针(Map.Entry<K,V>
)
316 private static class Entry<K,V> extends HashMap.Entry<K,V> {
317 // These fields comprise the doubly linked list used for iteration.
318 Entry<K,V> before, after;
319
320 Entry(int hash, K key, V value, HashMap.Entry<K,V> next) {
321 super(hash, key, value, next);
322 }
散列之所以出现,是因为它是一种创建集合的简单方法,该集合强制唯一性并为大多数操作提供恒定时间性能。当然,我们可以只使用链表并添加唯一性检查,但是几个操作的时间将变为 O(N),因为您必须迭代整个列表以检查重复项。