我想存儲50000或更多的字符串,我需要執行一些操作,比如檢索特定的字符串,刪除特定的字符串等。我只給出了兩個選項供選擇,這些是數組列表和數組存儲它們。從性能角度來看哪個更好?從性能的角度來看,哪一個更好?數列或數組?
回答
也沒有。如果你想檢索特定的字符串(例如獲取字符串「Foo」)並刪除特定的字符串(例如刪除「Foo」),我會考慮使用Set
。
數組列表或數組會給你O(N)檢索(除非你保持它的排序)。 A Set
通常會給你至少O(lg N)的時間來找到一個特定的物品。
ArrayList
支持一個數組,所以性能明智,你應該看到沒有區別。
如果你的要求沒有錯誤,而且你必須在一個數組列表和一個原始數組中選擇,我會建議一個數組列表,因爲你擁有所有的API來操縱你可以寫的數據你自己的原始數組String
s。
爲什麼downvote? – Cratylus 2012-04-10 17:06:15
一個抽象總會產生至少*一些*開銷。 Python是由C「支持」的,它由x86「支持」(至少在我的電腦中),但這並不意味着我會像使用匯編代碼那樣獲得與Python相同的性能。 – NullUserException 2012-04-10 17:10:36
@NullUserException:我過去一直堅信,但我一直在閱讀各種鏈接,'Java'(由C解釋並支持)並不比'C++'慢,並且它更快地更快 – Cratylus 2012-04-10 17:12:19
一個數組比ArrayList更有效的表現明智,但除非你知道你將放入一個數組中多少個元素,ArrayList將是一個更好的選擇,因爲數組列表的大小可以根據需要增長,而靜態數組不能。
奇怪的答案。1)爲什麼你會假設一個靜態數組?2)ArrayList是一個數組支持的。 – Cratylus 2012-04-10 17:08:18
靜態數組可以像「ArrayList」一樣「增長」,唯一的區別是您必須自己編寫正在增長的函數(創建新數組和複製數據),ArrayList自動爲您執行此操作。 – twain249 2012-04-10 17:10:55
在創建時數組[]的大小是靜態的,是的,arraylist在內部使用數組,但它們不相同,因爲當您創建新數組並且自己複製原始數組中的數據時,您剛剛重新創建了數組列表,並且回到O(n)。問題在於關於哪一個是更快的性能明智的,並且數組在性能上比ArrayList更快。 – ChadNC 2012-04-10 17:42:38
檢索特定的字符串,刪除特定的字符串...我認爲ArrayList不是最好的解決方案。看看HashSet或LinkedHashSet。
一個數組總是會有比ArrayList
更好的性能。部分原因是,當使用數組時,您不必支付類型轉換其元素的額外費用(使用泛型並不意味着類型轉換消失,只是它們隱藏在純視圖中)。
爲了使我的觀點:Trove和fastutil是一對情侶非常快的Java集合庫,這依賴於提供特定類型的集合的事實而不是基於對象的實現比如ArrayList
一樣。
此外,還有使用訪問元素(雖然小)一個get()
方法和調整操作的成本,這可能是巨大的ArrayLists
重要許多插入和刪除成本。當然,這不會發生在陣列上,因爲它們本質上具有固定大小,這既是優點也是劣勢。回答你的問題:如果你事先知道你將需要的元素數量,並且這些元素不會有太大的變化(插入,刪除),那麼你最好的選擇就是使用數組。如果需要修改某些操作並且性能至關重要,請嘗試使用Trove或fastutil。
你在說什麼對我來說很合理。但是如果它沒有被測量,我不確定它們之間是否有這樣的性能差異。你是否有一些鏈接指定了一些測量值? – Cratylus 2012-04-10 17:10:21
如果你看一下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永遠不會比使用數組更快。
正確地提供了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;
}
- 1. 從性能的角度來看哪一個使用mysqli_fetch_assoc或mysqli_fetch_array?
- 2. 角度和數據庫從性能角度來看
- 3. 哪種編程風格更好?從優化的角度來看
- 4. 隊列性能更好的實現 - 數組或鏈接列表
- 5. 哪一個是性能角度最好的編譯器?
- 6. 哪個更好的方式來setListData在jList,向量或數組?
- 7. 從外部.exe啓動v/s startin作爲windows服務,從性能角度來看哪一個更高效?
- 8. 哪一個有更好的性能?
- 9. 從性能的角度來看,使用常量來表示語言文件是一個好主意?
- 10. 從性能角度來看,以下SQL是好還是壞的做法?
- 11. 哪種數據庫性能更好?
- 12. 哪一個更好從DATE_FORMATE()或MONTH(),YEAR()
- 13. 哪個更好.success()或.then()角
- 14. 重複數據或更好的性能?
- 15. 從網站性能角度來看,DTO有哪些優點和缺點?
- 16. 哪個具有更好的性能,Java或DB功能?
- 17. 哪些性能更好 - 在AppSettings或數據庫中配置?
- 18. 將數據從一個角度組件傳遞到另一個角度組件
- 19. 從性能角度來看,嵌入MongoDB與參考相比
- 20. 哪一個更好(支持,難度...)來開發一個插件,Netbeans或Eclipse?
- 21. MYSQL函數或PHP函數,哪一個更好?
- 22. 哪一個更好的實現來實現一個trie節點的子節點 - 數組或hashmap?
- 23. 哪個有更好的渲染性能,Stackpanel或Canvas + TranslateTransform? WPF/Silverlight
- 24. 看看3個或更多的數字匹配的數組
- 25. 找到哪些函數被調用(從變量的角度來看)
- 26. SQL索引性能,哪個更好?
- 27. 在PHP中哪個性能更好?
- 28. 哪給了我更好的性能Activerecord find_by或者哪裏?
- 29. 哪一個更好的FCM或GCM?
- 30. 鋸齒狀陣列和展平陣列,哪個性能更好?
爲什麼一個'Set'而不是'Map'?他可能需要重複 – Cratylus 2012-04-10 17:05:34
這個問題沒有給出任何信息與字符串相關的值,所以'Set'看起來更自然。 – 2012-04-10 17:07:16
+1。可以是任何類型的Set,就是這一點。 – 2012-04-10 17:08:01