java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?
為什么Java向量被認為是遺留的類,過時的或被棄用的?
使用并發時,它的使用是否有效?
如果我不想手動同步對象,只想使用線程安全集合而不需要對底層數組進行新的復制(如CopyOnWriteArrayList所做),那么使用Vector是否可以?
那么作為Vector的一個子類的Stack呢,我應該用什么來代替它呢?
它們是過時的,但不被棄用。
Vector在每個單獨操作上同步。這幾乎不是你想做的。
通常,您希望同步整個操作序列。同步單個操作既不太安全(例如,如果您在Vector上進行迭代,您仍然需要取出一個鎖,以避免其他人同時更改集合,這將導致迭代線程中出現ConcurrentModificationException),也會變慢(為什么在一次足夠時重復取出一個鎖)?
當然,它也有鎖的開銷,即使你不需要鎖。
基本上,在大多數情況下,它是一種非常有缺陷的同步方法。正如Brian Henk先生指出的那樣,您可以使用Collections.synchronizedList等調用來裝飾一個集合——事實上,Vector將"調整大小的數組"集合實現與"同步每個操作"位結合在一起,這是糟糕設計的另一個例子;裝飾方法提供了更清晰的關注分離。
至于Stack等價物,我先看Deque和ArrayDeque。
"一般情況下,您希望同步整個操作序列。"—這就是重點!謝謝!
在哪種版本的Java表示向量(目前我使用Java7),但我從來沒有看到一個棄權?再見,很好的解釋…+1
@薩米爾:這并不是官方反對的——只是普遍傾向于使用ArrayList。
你能告訴我,將來會發生這種事嗎?
@薩米爾:不,我不會去預測未來。
@喬恩謝謝你的解釋。一個微小的修正——例如,"如果你在一個向量上迭代,你仍然需要取出一個鎖來避免其他人同時更改集合"的語句,只是部分正確——如果發生這種情況,迭代器將拋出一個ConcurrentModificationException來避免不可預知的行為。
@亞歷克斯:好吧,我的意思是你同步以避免另一個線程試圖這樣做的后果。將澄清。
@亞歷克斯:迭代器將嘗試拋出異常。但這并不能保證。文檔基本上說"這只是為了幫助檢測錯誤。不要依賴它。"
好的(填充空間…)
簡單地說GR8。vector不是棄用它的遺留類。棄用和遺留類之間必須有區別,是的,請參閱stackoverflow.com/questions/2873254/…
有沒有我們實際需要使用向量的情況??
@Rajaasthana:好吧,您可能正在與另一個使用它的API進行互操作。不過,我記不起上次用新代碼看到它的時候了。
我確實看到了很多代碼,特別是在添加錯誤時,比如errorvector.add("無效名稱")。我們需要避免這個嗎?
@拉賈阿斯塔納:那真的取決于上下文。你在哪里看到這些代碼?它是否在某些遺留代碼庫中?
是的,它在舊代碼庫中。
@拉賈阿斯塔納:那就是你看到它的原因,基本上。
@上一次我在代碼中看到矢量是在Giulio Zambon的"Starting JSP,JSF and Tomcat"中的一些示例代碼中。我正在看。現在,在讀了你的帖子之后,我想知道他為什么還在使用它?特別是在他開始安裝Java 7 SDK(和Tomcat 7)的書時。至于代碼本身,他使用它是因為同步…
@尼納德:我真的不能回答這個問題——但如果我寫這樣一本書,我就不會這么做了。
向量有一個簡短的誘人的名字和它的壕溝在C++中的優勢,這是許多程序員開始的。除了(效率低下)與向量的內置同步之外,您應該能夠對ArrayList執行任何可以對向量執行的操作,并且通常執行得更快。
我從來都不明白為什么有人僅僅因為某些API的效率低下而把它的某些部分稱為"死的"或"遺留的"。新聞快訊:幾乎所有的算法都可以優化,很多都是低效的-但沒有人稱它為"死"。效率不再重要了,我們正處于21世紀,所以除非你正在為航天飛機編寫高性能的嵌入式軟件(好吧,繼任者),否則就沒有必要對這種API大聲疾呼——即使是這樣:軟件工程師只需選擇一些替代方案,他們不會大聲疾呼,但現在也不擔心這一點:)
@專家:我認為,如果有一個在大多數情況下明顯更好的替代方案,那么稱它為遺留API是完全合理的。Vector不僅在不必要的同步方面效率較低,而且通過進行同步,它可以給剛開始線程化的用戶帶來線程安全的錯覺,并認為同步每個操作足以使其安全地跨線程任意使用。我仍然很高興地建議在幾乎所有的情況下從Vector轉到ArrayList。
這沒有任何意義——如果有更好的選擇,稱之為"遺產"是合理的?你可能想再考慮一下……根據這種推理,幾乎所有現存的東西都是"遺產"
@專業人員:不,我不這么認為。搜索"define:legacy",計算的相關形容詞表示:"表示或與已被取代但由于其廣泛使用而難以取代的軟件或硬件相關。"這聽起來與我所說的很相似。請注意,"在大多數情況下更好"是一個相當高的標準——而在某些情況下,LinkedList比ArrayList好,相反的情況往往是正確的——兩者都沒有有效地貶低另一個。
@specialist:同樣,從jls 9.6.4.6:"注釋為@deprecated的程序元素是不鼓勵程序員使用的元素,通常是因為它很危險,或者因為存在更好的替代方法。"(是的,我知道deprecated和legacy不是同一個詞,但它們在這里通常是同義詞。不是說Vector被正式否決了,請注意…就像Date和Calendar不是,但我也不想在新開發中使用它們。)
…所以它也被棄用了,因為你不想使用它。光暈。
@專家:我認為在這個階段我們必須同意不同意。
對于并發問題,我們可以使用Java并發包。但是,我們可以編寫以非線程安全方式訪問集合的代碼。
@喬恩,謝謝你的回答。"對于一個Stack等價物,我先看Deque/ArrayDeque,Stack是否也有同步方法作為它的超類Vector呢?我們應該用適用于Deque/ArrayDeque的Collections.synchronizedList來代替Stack嗎?
@本:不管怎樣,我希望Stack中的任何調用都能通過超類方法進行,但我必須檢查以確保。
Vector是1.0的一部分——最初的實現有兩個缺點:
1。命名:向量僅僅是可以作為數組訪問的列表,因此它應該被稱為EDCOX1×9(即Java 1.2集合替換EDCOX1×1)。
2。并發性:所有get()、set()方法都是synchronized方法,所以不能對同步進行細粒度控制。
ArrayList和Vector沒有太大的區別,但是你應該使用ArrayList。
來自API文件。
As of the Java 2 platform v1.2, this
class was retrofitted to implement the
List interface, making it a member of
the Java Collections Framework. Unlike
the new collection implementations,
Vector is synchronized.
列出哪些可以作為數組訪問?arraylist并不是一個很短或很吸引人的名字,這可能就是為什么在其他地方使用vector(例如stl)。
@以數組作為底層實現的數據列表。有ArrayList和LinkedList等,它們都實現了接口List,所以如果你想使用List方法,而不必知道底層實現實際上是什么,你只需要把List作為方法的參數,等等,這同樣適用于Map等的實現者。同時,C++確實有一個EDCOX1×20類,它只是一個基于模板的C型靜態長度數組的替換。
除了已有的關于使用向量的答案之外,向量還有一組圍繞枚舉和元素檢索的方法,它們不同于列表接口,開發者(尤其是那些在1.2之前學習Java的人)可以在代碼中使用它們。盡管枚舉速度更快,但它們不會檢查集合是否在迭代過程中被修改,這可能會導致問題,并且考慮到可能會選擇向量進行同步(通過多個線程的助理訪問),這使得它成為一個特別有害的問題。這些方法的使用還將許多代碼與向量耦合起來,這樣就不容易用不同的列表實現替換它。
您可以使用java.util.Collection上的synchronizedCollection/list方法從非線程安全集合中獲取線程安全集合。
為什么這比向量更好?
正如jon所提到的,vector的性能不會很好,這個方法允許您選擇何時進行同步是一個好主意。這完全是一個設計問題。您應該使用arraylist over vector,因為您應該默認為非同步訪問。
這是如何回答這個問題的?
java.util.Stack繼承java.util.Vector的同步開銷,這通常是不合理的。
不過,它繼承的遠不止這些。事實上,java.util.Stack extends java.util.Vector是面向對象設計中的一個錯誤。純粹主義者會注意到,除了傳統上與堆棧相關的操作(即:push、pop、peek、size),它還提供了許多方法。也可以進行search、elementAt、setElementAt、remove和許多其他隨機訪問操作。基本上由用戶決定,不要使用Stack的非堆棧操作。
基于這些性能和OOP設計原因,JavaDoc for java.util.Stack建議將ArrayDeque作為自然替代品。(deque不僅僅是一個堆棧,但至少它僅限于操作兩端,而不是提供對所有內容的隨機訪問。)
總結
以上是生活随笔為你收集整理的java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php幻灯片禁止重复,飞飞php影视系统
- 下一篇: thinkpad t400,t500 b