天天看點

你還在使用錯誤的List集合嗎?快來看看這篇文章吧!

作者:你的老師父

List是Java中最常用的集合之一,它可以存儲一組有序的元素,并提供了豐富的操作方法。本篇部落格将深入講解Java中所有List集合的實作、特點和使用方法,以及使用示例代碼示範各個實作之間的差别和各自的特點。

一、ArrayList

ArrayList是Java中最常用的List實作類之一,它基于數組實作,可以動态擴充容量。由于其内部基于數組,是以可以快速通路和修改元素,但插入和删除元素可能會涉及到數組的移動操作。同時,由于是基于數組實作,是以對于大量删除或插入元素的情況下,建議考慮使用LinkedList等其他實作方式。

1. ArrayList的特點

  • ArrayList是基于數組實作的,可以快速通路和修改元素;
  • ArrayList可以動态擴充容量,但插入和删除元素可能會涉及到數組的移動操作;
  • ArrayList不是線程安全的,需要在多線程環境下進行同步。

2. ArrayList的使用方法

以下是ArrayList的常見使用方法:

// 建立一個空的ArrayList
ArrayList<String> list = new ArrayList<>();

// 添加元素
list.add("apple");
list.add("banana");
list.add("orange");

// 擷取元素
String fruit1 = list.get(0);
String fruit2 = list.get(1);
String fruit3 = list.get(2);

// 修改元素
list.set(1, "grape");

// 删除元素
list.remove(2);

// 周遊元素
for (String fruit : list) {
    System.out.println(fruit);
}
           

在這個例子中,我們首先建立了一個空的ArrayList對象,然後通過 add() 方法添加了三個字元串類型的元素。通過 get() 方法擷取指定位置的元素,通過 set() 方法修改指定位置的元素,通過 remove() 方法删除指定位置的元素。最後,通過 foreach 循環周遊集合中的所有元素,并輸出它們的值。

二、LinkedList

LinkedList是Java中另一個常見的List實作類,它基于連結清單實作,可以快速插入和删除元素。由于其内部基于連結清單,是以在通路和修改元素時可能會比ArrayList慢一些,但插入和删除元素則具有更好的性能。同時,由于是基于連結清單實作,是以不需要像ArrayList一樣進行數組移動操作,是以對于大量删除或插入元素的情況下,LinkedList是更好的選擇。

1. LinkedList的特點

  • LinkedList是基于連結清單實作的,可以快速插入和删除元素;
  • LinkedList在通路和修改元素時可能會比ArrayList慢一些;
  • LinkedList不是線程安全的,需要在多線程環境下進行同步。

2. LinkedList的使用方法

以下是LinkedList的常見使用方法:

// 建立一個空的LinkedList
LinkedList<String> list = new LinkedList<>();

// 添加元素
list.add("apple");
list.add("banana");
list.add("orange");

// 擷取元素
String fruit1 = list.get(0);
String fruit2 = list.get(1);
String fruit3 = list.get(2);

// 修改元素
list.set(1, "grape");

// 删除元素
list.remove(2);

// 周遊元素
for (String fruit : list) {
    System.out.println(fruit);
}
           

在這個例子中,我們首先建立了一個空的LinkedList對象,然後通過 add() 方法添加了三個字元串類型的元素。通過 get() 方法擷取指定位置的元素,通過 set() 方法修改指定位置的元素,通過 remove() 方法删除指定位置的元素。最後,通過 foreach 循環周遊集合中的所有元素,并輸出它們的值。

三、Vector

Vector是Java中最早的List實作類之一,使用方法與ArrayList類似。但由于Vector是線程安全的,是以在多線程環境下使用較為安全。不過,在單線程環境下,建議使用ArrayList,因為它比Vector更快。

1. Vector的特點

  • Vector是基于數組實作的,可以快速通路和修改元素;
  • Vector可以動态擴充容量,但插入和删除元素可能會涉及到數組的移動操作;
  • Vector是線程安全的,可以在多線程環境下使用。

2. Vector的使用方法

以下是Vector的常見使用方法:

// 建立一個空的Vector
Vector<String> vector = new Vector<>();

// 添加元素
vector.add("apple");
vector.add("banana");
vector.add("orange");

// 擷取元素
String fruit1 = vector.get(0);
String fruit2 = vector.get(1);
String fruit3 = vector.get(2);

// 修改元素
vector.set(1, "grape");

// 删除元素
vector.remove(2);

// 周遊元素
for (String fruit : vector) {
    System.out.println(fruit);
}
           

在這個例子中,我們首先建立了一個空的Vector對象,然後通過 add() 方法添加了三個字元串類型的元素。通過 get() 方法擷取指定位置的元素,通過 set() 方法修改指定位置的元素,通過 remove() 方法删除指定位置的元素。最後,通過 foreach 循環周遊集合中的所有元素,并輸出它們的值。

四、CopyOnWriteArrayList

CopyOnWriteArrayList是Java中的一種特殊List實作類,它通過複制一個新的數組來實作線程安全性。在寫操作時,它會先将原數組複制一份,在新的數組中進行修改,然後再将新的數組替換到原來的位置上。在讀操作時,則直接通路原數組即可。由于寫操作需要複制整個數組,是以它的性能比較低,适合使用在讀多寫少的場景中。

1. CopyOnWriteArrayList的特點

  • CopyOnWriteArrayList是基于數組實作的,可以快速通路和修改元素;
  • CopyOnWriteArrayList通過複制一個新的數組來實作線程安全性;
  • CopyOnWriteArrayList适合使用在讀多寫少的場景中。

2. CopyOnWriteArrayList的使用方法

以下是CopyOnWriteArrayList的常見使用方法:

// 建立一個空的CopyOnWriteArrayList
CopyOnWriteArrayList<String> list = new CopyOnWriteArrayList<>();

// 添加元素
list.add("apple");
list.add("banana");
list.add("orange");

// 擷取元素
String fruit1 = list.get(0);
String fruit2 = list.get(1);
String fruit3 = list.get(2);

// 修改元素
list.set(1, "grape");

// 删除元素
list.remove(2);

// 周遊元素
for (String fruit : list) {
    System.out.println(fruit);
}
           

在這個例子中,我們首先建立了一個空的CopyOnWriteArrayList對象,然後通過 add() 方法添加了三個字元串類型的元素。通過 get() 方法擷取指定位置的元素,通過 set() 方法修改指定位置的元素,通過 remove() 方法删除指定位置的元素。最後,通過 foreach 循環周遊集合中的所有元素,并輸出它們的值。

五、總結

本篇部落格深入講解了Java中所有List集合的實作、特點和使用方法,并使用示例代碼示範各個實作之間的差别和各自的特點。對于開發者來說,了解各個List實作的優缺點,選擇适合自己業務場景的集合是非常重要的。

同時,在實際開發中,也需要考慮資料通路的線程安全性和效率問題,是以需要根據具體情況選擇合适的List實作。總之,掌握List集合的知識是Java開發者必備的技能。

六、留給讀者的問題

  1. 除了ArrayList、LinkedList、Vector和CopyOnWriteArrayList,還有哪些List集合的實作?
  2. 什麼樣的場景适合使用ArrayList?什麼樣的場景适合使用LinkedList?

繼續閱讀