[英]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.