簡體   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