它看起來像使用Java進行編程時,我們並不想在涉及到線程時再使用Vectors。我可以使用什麼來代替Java中的Vector?
使用線程時,應該使用什麼類而不是Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();
它看起來像使用Java進行編程時,我們並不想在涉及到線程時再使用Vectors。我可以使用什麼來代替Java中的Vector?
使用線程時,應該使用什麼類而不是Vector?
import java.util.Vector;
Vector<String> v = new Vector<String>();
List<String> list = Collections.synchronizedList(new ArrayList<String>());
陣列,但如果你不知道的大小,使用concurrentmap
假設你想快速隨機訪問元素(這就是爲什麼列表將是一個壞主意) – necromancer 2011-03-08 22:22:24
區別是:一個地圖提供按鍵隨機訪問,一個列表通過索引提供隨機訪問(或多或少有效)。 – 2011-03-08 22:30:10
你的意思是地圖提供O(log(n))訪問,而列表提供O(1)?那麼它會混淆討論,將其稱爲列表 - 它是一個在列表界面中僞裝的數組。如果你知道尺寸,陣列顯然是最好的,最容易理解的選擇。只有當你不知道你選擇的尺寸是在地圖之間,還是在多線程情況下可提高性能的陣列時,它們會提供不可預測的性能。 – necromancer 2011-03-08 23:10:48
使用列表的實施和他們像
List<?> list = Collections.synchronizedList(new ArrayList<?>());
對於線程安全的情況下進行同步,使用ArrayList
。
對於線程安全的情況下,使用什麼是最合適你的情況,CopyOnWriteArrayList
,Queue
,BlockingDeque
等前來諮詢更多,我們需要知道你是怎麼處理的事情與你的收藏。
我建議不要使用Collections.synchronizedList(...)
包裝,因爲它可能無法很好地擴展(除非您不太在意可擴展性)。但這一切都取決於你的背景。
它看起來像使用Java進行編程時,我們不會在涉及到線程時使用向量。
你需要使用Vector
被認爲是在大多數情況下是一件壞事,瞭解爲什麼。原因是:
Vector
在每個操作上同步。大多數上下文不需要細粒度的同步,因此這是不必要的性能開銷。
Vector.elements()
方法返回一個不具有快速失敗語義的Enumeration
。
回到你的問題。該方案取決於你的線程正在嘗試做的:
如果用例不需要同步所有,使用ArrayList
,或LinkedList
。您通常會使用這些:
ArrayList
。如果用例需要細粒度同步,Collections.synchronizedList
包裝相當於一個Vector
。或者,您可以堅持使用Vector
並避免使用elements()
操作。
A CopyOnWriteArrayList
列表的優點是它的迭代器支持併發修改...在某種意義上。如果您的應用程序主要執行讀取列表,它也會更好地擴展。讀操作根本不需要明確同步,通常只需要讀取一次volatile
一次。但另一面是寫操作確實同步,並且比「正常」的價格貴得多。
的另一個問題Vector
和Collections.synchronizedList
包裝的是,一些用例需要較粗的同步;例如測試列表的大小並有條件地在單個同步操作中添加元素。 Queue
和Deque
類提供了更高級別的抽象處理這種事情......用於涉及從一個線程異步傳遞工作到另一個線程的用例。
底線是沒有一刀切的解決方案。您需要了解應用程序設計的併發特性,並相應地選擇您的數據結構。
最後,如果你是編程爲Java ME,你可能會堅持使用Vector
,這取決於J2ME配置文件,你的目標。
@ VSH3R請參閱http://stackoverflow.com/questions/703990/why-is-c-list-not-thread-safe和http://www.ibm。 COM/developerWorks的/ JAVA /庫/ J-jtp09263.html。 – tiago2014 2011-03-09 00:01:31
這是一個或多或少的'Vector'插件替代品。但它不一定是正確的使用。 – 2011-03-08 23:01:36
謝謝。我將不得不將一些向量轉換爲列表。 – VSH3R 2011-03-10 04:44:27