有人能向我解釋如何在Java工作HashSets,爲什麼他們是不是使用的ArrayList快?
回答
首先,HashSet
,不像ArrayList
是Set:它不能包含重複項,而ArrayList
可以 - 因此它們是爲不同目的而構建的。它也不保證排序 - 再次,不像列表。
其次-a HashSet
建立在hash table數據結構上,它允許O(1)
尋道時間的元素。
注意,很多時候,一個HashSet
是慢那麼ArrayList
- 如果你想在例如元素迭代 - 通常做在ArrayList
會更快然後在惡劣高速緩存性能HashSet
[因爲的哈希值,其他的原因]
A HashSet
實際上是一個HashMap
其中值始終相同。
在很多地方(它也被稱爲「哈希表」)描述了一個HashMap
工作的方式。簡而言之:它會生成密鑰(對象)的哈希值並將它們放入一個表中。然後,每次查找密鑰時,都會計算其哈希值,並直接引用表中的存儲桶。這意味着你只有一個操作(最好的情況)來訪問地圖。
HashSet
只是包含密鑰,所以.contains(..)
是O(1)
。那和remove(..)
是唯一的操作HashSet
比ArrayList
(它是O(n))更快。迭代是一樣的,加法是一樣的。
只是爲了增加描述性的答案,迭代應該是O(n),並且應該是O(1)時間複雜度,就像HashMap一樣。要檢查的一個很好的概念是重新散列,在數據結構中要存儲更多數據(使用加載因子檢查),因此需要爲相同的表創建更大的表,從而導致平均插入時間增加。 – 2014-09-30 17:19:00
作爲事實上,例如超過迭代和附加到ArrayList更快之間。
而且,你甚至不能排序一個HashSet。
但是最快的是NoOp。沒有任何東西可以像NoOp一樣快。當然,NoOp並沒有太大的作用。但它真的很快!
你需要在你認爲比「快於」更精確。
這些是2種不同的數據結構。
HashSet
背後的概念是關鍵探索。
I.e.您使用輸入鍵的轉換來獲取數組中值的位置的索引。
這是一個常量O(1)
操作,因爲數組允許隨機訪問。
ArrayList也是O(1)
操作訪問,因爲它也支持一個數組。 但僅限於隨機訪問和插入。
的搜索雖然是一個ArrayList O(N)
操作,因爲你必須通過在列表中的所有elemements搜索去不像HashSet
值,你只變換密鑰和訪問陣列。在HashSet
中搜索的結果是O(1)
- 1. 如何在.NET中使用Hashtables/HashSets?
- 2. 在java中如何工作?
- 3. 如何工作的在Java
- 4. Java的PreparedStatement如何工作?
- 5. 製作一個HashMap,其鍵值爲HashSets
- 6. 兩個HashSets搜索
- 7. java中的監聽器如何工作
- 8. Java中的遞歸它如何工作?
- 9. Java中的join()方法如何工作?
- 10. Java中的引用如何工作?
- 11. Java中的Integer.toString如何正確工作?
- 12. java中的斷言如何工作?
- 13. Java中的圖形類如何工作?
- 14. Java中的comapareTo方法如何工作?
- 15. Java中的上傳如何工作?
- 16. java中的clone()方法如何工作?
- 17. 如何將HashSets合併爲一個使用java 8 streaming的限制?
- 18. Java對象如何工作?
- 19. java如何同步工作
- 20. Java:陣列如何工作
- 21. Java API如何工作
- 22. Java thread.stop()如何工作?
- 23. Java url.openStream()如何工作
- 24. Java JVM如何工作?
- 25. 泛型如何工作Java
- 26. Java轉換如何工作?
- 27. 在Java中如何同步工作
- 28. 這將如何在Java中工作?
- 29. 「import *」如何在Java中工作?
- 30. JMS如何在Java中工作?
是否更快取決於您使用它的方式。例如,HashMap永遠不會比索引ArrayList 更快地查找索引。它可以更快速地處理集合,但即使這樣也取決於添加東西的方式。 –
cHao
2012-02-02 20:55:03
拿起一本關於數據結構和算法的好書,比如* Introduction to Algorithms *,並閱讀哈希表。 – 2012-02-02 20:55:09
http://docs.oracle.com/javase/tutorial/collections/ – JSager 2012-02-02 20:55:45