2012-04-10 82 views

回答

2

也沒有。如果你想檢索特定的字符串(例如獲取字符串「Foo」)並刪除特定的字符串(例如刪除「Foo」),我會考慮使用Set

數組列表或數組會給你O(N)檢索(除非你保持它的排序)。 A Set通常會給你至少O(lg N)的時間來找到一個特定的物品。

+0

爲什麼一個'Set'而不是'Map'?他可能需要重複 – Cratylus 2012-04-10 17:05:34

+0

這個問題沒有給出任何信息與字符串相關的值,所以'Set'看起來更自然。 – 2012-04-10 17:07:16

+0

+1。可以是任何類型的Set,就是這一點。 – 2012-04-10 17:08:01

1

ArrayList支持一個數組,所以性能明智,你應該看到沒有區別。

如果你的要求沒有錯誤,而且你必須在一個數組列表和一個原始數組中選擇,我會建議一個數組列表,因爲你擁有所有的API來操縱你可以寫的數據你自己的原始數組String s。

+1

爲什麼downvote? – Cratylus 2012-04-10 17:06:15

+2

一個抽象總會產生至少*一些*開銷。 Python是由C「支持」的,它由x86「支持」(至少在我的電腦中),但這並不意味着我會像使用匯編代碼那樣獲得與Python相同的性能。 – NullUserException 2012-04-10 17:10:36

+1

@NullUserException:我過去一直堅信,但我一直在閱讀各種鏈接,'Java'(由C解釋並支持)並不比'C++'慢,並且它更快地更快 – Cratylus 2012-04-10 17:12:19

1

一個數組比ArrayList更有效的表現明智,但除非你知道你將放入一個數組中多少個元素,ArrayList將是一個更好的選擇,因爲數組列表的大小可以根據需要增長,而靜態數組不能。

+0

奇怪的答案。1)爲什麼你會假設一個靜態數組?2)ArrayList是一個數組支持的。 – Cratylus 2012-04-10 17:08:18

+1

靜態數組可以像「ArrayList」一樣「增長」,唯一的區別是您必須自己編寫正在增長的函數(創建新數組和複製數據),ArrayList自動爲您執行此操作。 – twain249 2012-04-10 17:10:55

+0

在創建時數組[]​​的大小是靜態的,是的,arraylist在內部使用數組,但它們不相同,因爲當您創建新數組並且自己複製原始數組中的數據時,您剛剛重新創建了數組列表,並且回到O(n)。問題在於關於哪一個是更快的性能明智的,並且數組在性能上比ArrayList更快。 – ChadNC 2012-04-10 17:42:38

0

檢索特定的字符串,刪除特定的字符串...我認爲ArrayList不是最好的解決方案。看看HashSet或LinkedHashSet。

1

一個數組總是會有比ArrayList更好的性能。部分原因是,當使用數組時,您不必支付類型轉換其元素的額外費用(使用泛型並不意味着類型轉換消失,只是它們隱藏在純視圖中)。

爲了使我的觀點:Trovefastutil是一對情侶非常快的Java集合庫,這依賴於提供特定類型的集合的事實而不是基於對象的實現比如ArrayList一樣。

此外,還有使用訪問元素(雖然小)一個get()方法和調整操作的成本,這可能是巨大的ArrayLists重要許多插入和刪除成本。當然,這不會發生在陣列上,因爲它們本質上具有固定大小,這既是優點也是劣勢。回答你的問題:如果你事先知道你將需要的元素數量,並且這些元素不會有太大的變化(插入,刪除),那麼你最好的選擇就是使用數組。如果需要修改某些操作並且性能至關重要,請嘗試使用Trove或fastutil。

+0

你在說什麼對我來說很合理。但是如果它沒有被測量,我不確定它們之間是否有這樣的性能差異。你是否有一些鏈接指定了一些測量值? – Cratylus 2012-04-10 17:10:21

0

如果你看一下source code of ArrayList您將看到:

107  /** 
    108  * The array buffer into which the elements of the ArrayList are stored. 
    109  * The capacity of the ArrayList is the length of this array buffer. 
    110  */ 
    111  private transient Object[] elementData; 

它在內部使用數組。

所以ArrayList永遠不會比使用數組更快。

0

正確地提供了ArrayList的大小,主要區別將來自於添加,它會做一個範圍檢查,您可以使用數組刪除範圍檢查。但我們在這裏討論幾個CPU週期。

除此之外,應該沒有明顯的差異。例如,ArrayList中的indexOf方法如下所示:

public int indexOf(Object o) { 
     if (o == null) { 
      for (int i = 0; i < size; i++) 
       if (elementData[i]==null) 
        return i; 
     } else { 
      for (int i = 0; i < size; i++) 
       if (o.equals(elementData[i])) 
        return i; 
     } 
     return -1; 
    } 
相關問題