我知道关于linkedHashSet
的一些事情我知道如果使用哈希,则会出现分组概念
但是,通过检查JDK中的代码,似乎 LinkedHashSet实现只包含构造函数而没有实现,所以我猜所有的逻辑都发生在HashSet中?
让我以这种方式提出我的问题......如果目标是写一个
的集合看到类似的问题what's the difference between HashSet and LinkedHashSet,但不是很有帮助
如果我需要更多地解释我的问题,请告诉我
答案 0 :(得分:1)
假。 LinkedHashSet
的实施完全在LinkedHashMap
。 (并且HashSet
的实现真的全在HashMap
。Le gasp!)
HashSet
根本没有链接列表。
完全有可能编写一个由链表支持的LinkedSet
集合,这使得元素保持独特 - 只是它的性能非常糟糕。
答案 1 :(得分:1)
这是一个'有趣'的实施。 LinkedHashSet的构造函数遵循HashSet
中的包私有构造函数,它们设置数据结构(LinkedHashMap)以维护迭代顺序。
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<E,Object>(initialCapacity, loadFactor);
}
API设计人员可以简单地将此构造函数公开,并提供适当的文档,但我想他们希望代码更加“自我记录”。
答案 2 :(得分:1)
如果你仔细观察,你会发现它实际上是在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 }
Hashing进入了画面,因为它是一种简单的方法来创建一个强制独特性的集合,并为大多数操作提供恒定的时间性能。当然,我们可以使用链表并添加唯一性检查,但是几次操作的时间将变为O(N),因为您必须迭代整个列表以检查重复项。
答案 3 :(得分:1)
代码示例
Set<Registeration> registerationSet = new LinkedHashSet<>();
registerationSet.add(new Registeration());
列表维护所有插入元素的输入顺序/队列
答案 4 :(得分:0)
对于您的问题的具体答案
Java Docs说的是什么......
- 与HashSet一样,它为基本操作(添加,包含和删除)提供恒定时间性能,假设散列函数在桶之间正确地分散元素。
- 此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。
哈希码访问的桶用于加速随机访问,而LinkedList实现用于返回按插入顺序吐出元素的迭代器。
希望我已经回答了你的问题?