[英]value change in ith element influences value in the 0th element for ArrayList
[英]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方法来执行此操作。 但是您可以执行以下操作
ArrayList(Set)
添加到列表中 Collections.reverse(List)
从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.