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

时间:2010-10-13 19:40:51

标签: java

我正在使用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) {
}

我们可以反过来吗?

由于

5 个答案:

答案 0 :(得分:7)

根据定义,集合与顺序无关。因此,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. 将设置添加到列表中
  3. 使用Collections.reverse(List)
  4. 迭代此列表

答案 1 :(得分:1)

根据LinkedHashMap的源代码判断(支持LinkedHashSet - 请参阅http://www.docjar.com/html/api/java/util/LinkedHashMap.java.html),插入是便宜的,就像在链表中一样。

答案 2 :(得分:0)

你不能在LinkedHashSet的前面添加元素......它没有诸如add(int, Object)之类的方法,也没有任何其他方法可以使用“{1}}的概念” set(这是一个List概念)。它仅根据插入元素的顺序提供一致的迭代顺序。最近插入的元素不在集合中,将是迭代它时的最后一个元素。

LinkedHashSet的Javadoc明确指出:

  

与HashSet一样,它为基本操作(添加,包含和删除)提供了恒定时间性能,假设哈希函数在桶之间正确地分散元素。

编辑:没有任何方法可以迭代LinkedHashSet,而不是将其复制到List并反过来迭代。for (String s : Lists.reverse(ImmutableList.copyOf(set))) { ... } 。使用Guava你可以这样做:

ImmutableList

请注意,虽然创建reverse确实需要迭代原始集的每个元素,但{{1}}方法只提供反向视图,并且不会自行迭代。

答案 3 :(得分:0)

要回答您的最新问题,LinkedHashSet没有可用的反向迭代器功能,即使内部实现使用双向链接列表。

有一个开放的增强请求:

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

Mark Peters链接到番石榴中可用的功能,尽管他们的反向列表实际上会生成一个反向列表。

答案 4 :(得分:0)

如前所述,LinkedHashSet是在LinkedHashMap上构建的,它建立在HashMap上:) Javadocs说,假设你的哈希函数正确实现,它需要花费很长时间才能将元素添加到HashMap中。如果你的哈希函数没有很好地实现,它可能需要达到O(n)。 此时不支持向后迭代。