繁体   English   中英

在LinkedHashSet的第0个位置插入元素的成本?

[英]Cost of inserting element at 0th position of LinkedHashSet?

我正在使用LinkedHashSet。 我想在第0个位置插入项目,例如:

Set<String> set = new LinkedHashSet<String>();
for (int i = 0; i < n; i++) {
    set.add(0, "blah" + i);
}

我不确定链接哈希集是如何实现的,插入是否会物理移动当前项目的所有地址,或者与插入链表实现中的插入成本相同?

谢谢

------编辑---------------

我完全搞砸了,是在引用ArrayList文档。 Set接口没有add(index,object)方法。 那么有没有办法向后迭代集合呢? 现在要迭代,我正在做:

for (String it : set) {
}

我们可以反向做吗?

谢谢

根据定义,集独立于顺序。 因此,Set没有可用的add(int,Object)方法。

LinkedHashSet http://download.oracle.com/javase/6/docs/api/java/util/LinkedHashSet.html也是这样

LinkedHashSet保持插入顺序,因此所有元素都添加到链接列表的末尾。 这是使用LinkedHashMap实现的。 您可以在LinkedHashMap http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html中查看方法linkEntry

编辑:回应已编辑的问题

没有可用的API方法来执行此操作。 但是您可以执行以下操作

  1. 使用新的ArrayList(Set)添加到列表中
  2. 使用Collections.reverse(List)
  3. 迭代此列表

从LinkedHashMap的源代码(支持LinkedHashSet的源代码-参见http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html )来看,插入很便宜,就像在链接列表中一样。

您不能在LinkedHashSet的前面添加元素...它没有诸如add(int, Object)方法,也没有任何其他使用集合中“索引”概念的方法(即List概念) )。 它仅根据插入元素的顺序提供一致的迭代顺序。 遍历该集合时,最后一个未插入的元素将是集合中的最后一个元素。

LinkedHashSet的Javadoc明确指出:

像HashSet一样,它为基本操作(添加,包含和删除)提供恒定时间的性能,假设哈希函数将元素正确地分布在存储桶中。

编辑 :没有任何方法可以像反向将LinkedHashSet反向复制一样,将其复制到List并对其进行反向迭代。 使用番石榴,您可以这样做:

for (String s : Lists.reverse(ImmutableList.copyOf(set))) { ... }

请注意,虽然创建ImmutableList确实需要迭代原始集合的每个元素,但是reverse方法只是提供了一个反向视图,而本身并没有完全迭代。

为了回答您的最新问题, LinkedHashSet没有可用的反向迭代器功能,即使该实现在内部使用双重链接列表也是如此。

对此有一个开放的增强请求:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4848853

马克·彼得斯(Mark Peters)链接到番石榴中可用的功能,尽管他们的反向列表实际上会生成反向列表。

如前所述,LinkedHashSet建立在LinkedHashMap之上,而LinkedHashMap则建立在HashMap之上:) Javadocs说,假设您的哈希函数已正确实现,则向HashMap中添加元素需要花费固定的时间。 如果您的散列函数实现不当,则可能需要O(n)。 目前不支持向后迭代。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM