日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?

發布時間:2024/3/26 java 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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"中的一些示例代碼中。我正在看?,F在,在讀了你的帖子之后,我想知道他為什么還在使用它?特別是在他開始安裝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和許多其他隨機訪問操作?;旧嫌捎脩魶Q定,不要使用Stack的非堆棧操作。

基于這些性能和OOP設計原因,JavaDoc for java.util.Stack建議將ArrayDeque作為自然替代品。(deque不僅僅是一個堆棧,但至少它僅限于操作兩端,而不是提供對所有內容的隨機訪問。)

總結

以上是生活随笔為你收集整理的java Vector 过时了_为什么Java Vector(和Stack)类被认为已过时或已弃用?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。