java hashing linkedHashSet的意义

时间:2013-02-01 04:07:01

标签: java collections hash

我知道关于linkedHashSet

的一些事情
  • 维护广告订单
  • 使用LinkedList保存订单
  • 我的问题是哈希如何进入画面?

我知道如果使用哈希,则会出现分组概念

但是,通过检查JDK中的代码,似乎 LinkedHashSet实现只包含构造函数而没有实现,所以我猜所有的逻辑都发生在HashSet中?

  • 所以hashSet默认使用LinkedList?

让我以这种方式提出我的问题......如果目标是写一个

的集合
  1. 维护唯一值
  2. 使用链接列表保留插入顺序然后...它可以很容易地完成而不需要哈希...可能我们可以调用此集合LinkedSet
  3. 看到类似的问题what's the difference between HashSet and LinkedHashSet,但不是很有帮助

    如果我需要更多地解释我的问题,请告诉我

5 个答案:

答案 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());

Line2的说明。

  1. 计算Registeration对象的hashCode
  2. 在registerationSet中搜索hashCode以找到存储桶
  3. 检查列入候选名单中的同等对象
    • 3.1。如果找到相等,则用新对象参考替换它
    • 3.2。如果未找到,则追加/添加注册表对象的存储桶
  4. 与之平行,

    列表维护所有插入元素的输入顺序/队列

    1. 始终,添加对结尾的新引用
    2. 如果需要更换(3.1以上),请删除之前的事件。

答案 4 :(得分:0)

对于您的问题的具体答案

  • 哈希是如何形成的? (在LinkedHashSet中)

Java Docs说的是什么......

  
      
  • 与HashSet一样,它为基本操作(添加,包含和删除)提供恒定时间性能,假设散列函数在桶之间正确地分散元素。
  •   
  • 此链接列表定义迭代排序,即元素插入集合(插入顺序)的顺序。
  •   

哈希码访问的桶用于加速随机访问,而LinkedList实现用于返回按插入顺序吐出元素的迭代器。

希望我已经回答了你的问题?