ArrayList 和 Vector 的區別


我們可以使用 Java 集合框架類 ArrayList 和 Vector 來儲存和管理專案列表。但是,瞭解兩者之間的一些重要區別至關重要。在本教程中,我們將探討 ArrayList 和 Vector 的效率、同步和迭代器功能,以及它們的異同點。在本課程結束時,您將全面瞭解何時在您的 Java 專案中使用 ArrayList 或 Vector。那麼,讓我們開始吧!

什麼是 ArrayList?

Java 的 ArrayList 類提供了一個動態陣列的實現。它是一個可調整大小的陣列,可以儲存任何資料型別的專案集合,包括對物件的引用和原始資料型別,例如“int”和“double”。它將元素儲存在單個連續的記憶體塊中;這樣,ArrayList 就與傳統陣列相同。

與標準陣列相比,ArrayList 可以根據新增的新成員或刪除的成員動態擴充套件或收縮。這意味著 ArrayList 可以容納可變數量的元素,而無需程式設計師預先確定其大小。

ArrayList 因其易用性和靈活性而在 Java 中被廣泛使用。它們提供了一種簡單的方法來處理和儲存專案集合,並且易於搜尋、排序和篩選。此外,ArrayList 作為物件實現,提供各種有用的方法來修改和查詢其內容。

ArrayList 的優點

  • 易於使用 − 由於 ArrayList 作為物件實現,幷包含各種有用的方法來操作和查詢其內容,因此易於使用。

  • 可調整大小 − 由於 ArrayList 是可調整大小的,因此可以在其中儲存任何大小的元素集合,而無需程式設計師顯式指定其大小。

  • 快速訪問 − ArrayList 可以快速訪問,因為與陣列一樣,它們使用基於索引的方法。

ArrayList 的缺點

  • 開銷 − 由於 ArrayList 產生的開銷,它可能比陣列需要更多的記憶體。此開銷是由於 ArrayList 類提供的額外功能造成的。

  • 效能下降 − 由於 ArrayList 類提供的額外功能,ArrayList 的執行速度可能比陣列慢。

  • 型別安全 − 與陣列不同,ArrayList 不是型別安全的,允許將不同資料型別的元素新增到 ArrayList 中。這可能會導致執行時錯誤。

  • 調整大小的成本 − 調整 ArrayList 的大小可能需要分配新的記憶體並將元素複製到記憶體中的新位置,這在時間和記憶體方面都可能代價高昂。

什麼是 Vector 類?

Java 的 Vector 類提供了一個與 ArrayList 類似的動態陣列實現。與 ArrayList 一樣,Vector 可以儲存任何資料型別的物件集合,包括對物件的引用和原始資料型別。

這是它與 ArrayList 的主要區別,因為 Vector 是一個同步類,並且它的所有方法都是執行緒安全的。因此,多個執行緒可以訪問和修改 Vector 物件,而無需擔心同步問題。

此外,Vector 提供了一些 ArrayList 中沒有的其他方法,例如獲取和更改 Vector 容量的方法,以及在特定位置插入和刪除元素的方法。不幸的是,由於與 Vector 的執行緒安全相關的開銷,這些額外的方法可能會對效能產生負面影響。

由於同步集合可能不如其非同步對應物高效,並且由於 Java 提供了其他執行緒安全的集合類,例如 ConcurrentLinkedQueue 和 CopyOnWriteArrayList,因此在現代 Java 開發中,向量通常比 ArrayList 使用得更少。但是,在某些情況下,如果執行緒安全是一個問題,並且需要向量提供的額外功能,它們仍然可能很有用。

向量的優點

  • 執行緒安全 − 由於 Vector 是一個同步類,因此它的所有方法都受到重疊執行緒的保護。這使其成為在使用多個執行緒的應用程式中使用的絕佳選擇,並且可能需要同時訪問和修改同一物件集合。

  • 動態大小 − 由於向量可以調整大小,因此它們可以容納範圍廣泛的元素,而無需程式設計師預先確定其大小。

  • 其他功能 − 除了 ArrayList 提供的方法外,向量還提供獲取和更改向量容量的方法,以及在特定位置新增和刪除元素的方法。

向量的缺點

  • 效能 − 由於與執行緒安全相關的開銷,在單執行緒應用程式中,Vector 可能比 ArrayList 慢。

  • 調整大小的成本 − 就像 ArrayList 一樣,向量可能需要分配新的記憶體並將元素複製到新位置。這在時間和記憶體方面都可能代價高昂。

  • 型別安全 − 與 ArrayList 類似,Vector 缺乏型別安全,這使得將不同資料型別的元素新增到 Vector 中變得容易。這可能會導致執行時錯誤。

  • 使用頻率較低 − 由於其效能開銷以及其他更有效的執行緒安全集合類的可用性,在現代 Java 開發中,Vector 通常比 ArrayList 或其他執行緒安全集合類使用得更少。

ArrayList 和 Vector 的區別

下表重點介紹了 ArrayList 和 Vector 之間的主要區別 −

ArrayList

Vector

陣列列表未同步。

向量是協調的。

如果陣列的容量超過,ArrayList 將陣列的大小增加 50%。

如果元素多於陣列可以容納的元素,則向量增量為 100%,陣列的大小加倍。

ArrayList 不是遺留類。它在 JDK 1.2 中引入。

Vector 是一個遺留類

由於 ArrayList 未同步,因此速度很快。

由於其同步性,向量很慢,因為它在多執行緒環境中使其他執行緒處於可執行或不可執行狀態,直到當前執行緒釋放對物件的鎖定。

ArrayList 使用 Iterator 介面迭代元素。

Vector 可以使用 Iterator 介面或 Enumeration 介面遍歷元素。

結論

總之,Java 類 ArrayList 和 Vector 都提供了動態陣列的實現。雖然 ArrayList 在單執行緒應用程式中效能更好,但由於其同步操作,Vector 是多執行緒應用程式的更好選擇。

此外,Vector 提供了一些 ArrayList 沒有的額外方法。但是,Vector 執行緒安全的效能成本使其在現代 Java 開發中不如 ArrayList 流行。

更新於: 2023 年 4 月 19 日

2K+ 閱讀量

開啟你的職業生涯

透過完成課程獲得認證

立即開始
廣告