在Java中,List
是集合框架中最常用的接口之一,繼承自Collection
,代表有序、可重復的元素集合(允許null
元素)。其核心實現類有ArrayList
(數組實現,隨機訪問高效)、LinkedList
(鏈表實現,增刪首尾元素高效)等。以下按功能分類詳解List
的常用API及使用示例:
一、添加元素(增)
向List中添加單個或批量元素,支持指定位置插入。
1. boolean add(E e)
- 功能:在List末尾添加元素
e
。 - 返回值:
true
(始終返回,因為List允許添加元素)。 - 示例:
List<String> list = new ArrayList<>();
list.add("A"); // 末尾添加"A"
list.add("B"); // 末尾添加"B"
System.out.println(list); // [A, B]
2. void add(int index, E element)
- 功能:在指定索引
index
處插入元素element
(原索引及后續元素后移)。 - 注意:
index
必須在[0, size()]
范圍內(否則拋IndexOutOfBoundsException
)。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
list.add(1, "C"); // 在索引1處插入"C"
System.out.println(list); // [A, C, B](原索引1的"B"后移)
3. boolean addAll(Collection<? extends E> c)
- 功能:將集合
c
中的所有元素批量添加到List末尾。 - 返回值:若List因添加而改變則返回
true
。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
List<String> newElements = Arrays.asList("C", "D");
list.addAll(newElements); // 批量添加到末尾
System.out.println(list); // [A, B, C, D]
4. boolean addAll(int index, Collection<? extends E> c)
- 功能:將集合
c
中的所有元素從指定索引index
處開始插入(原索引及后續元素后移)。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
List<String> newElements = Arrays.asList("C", "D");
list.addAll(1, newElements); // 從索引1處插入
System.out.println(list); // [A, C, D, B]
二、刪除元素(刪)
移除List中的單個或批量元素,支持按索引或元素值刪除。
1. E remove(int index)
- 功能:刪除指定索引
index
處的元素,返回被刪除的元素(后續元素前移)。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String removed = list.remove(1); // 刪除索引1的元素
System.out.println(removed); // B
System.out.println(list); // [A, C]
2. boolean remove(Object o)
- 功能:刪除首次出現的元素
o
(通過equals()
判斷),返回是否刪除成功。 - 注意:若元素為
null
,會刪除首次出現的null
(因為null.equals()
會拋異常,內部用==
判斷null
)。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "A"));
boolean isRemoved = list.remove("A"); // 刪除首次出現的"A"
System.out.println(isRemoved); // true
System.out.println(list); // [B, A]
3. boolean removeAll(Collection<?> c)
- 功能:刪除List中所有包含在集合
c
中的元素(批量刪除,保留不在c
中的元素)。 - 返回值:若List因刪除而改變則返回
true
。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
List<String> toRemove = Arrays.asList("B", "D");
list.removeAll(toRemove); // 刪除所有"B"和"D"
System.out.println(list); // [A, C]
4. boolean retainAll(Collection<?> c)
- 功能:保留List中所有包含在集合
c
中的元素(即刪除不在c
中的元素,求交集)。 - 返回值:若List因保留而改變則返回
true
。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
List<String> toRetain = Arrays.asList("B", "C");
list.retainAll(toRetain); // 只保留"B"和"C"
System.out.println(list); // [B, C]
5. void clear()
- 功能:清空List中所有元素(size變為0,但對象本身仍可使用)。
- 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B"));
list.clear();
System.out.println(list.size()); // 0
System.out.println(list); // []
三、獲取與修改元素(查、改)
通過索引獲取元素,或修改指定位置的元素。
1. E get(int index)
- 功能:返回指定索引
index
處的元素。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String element = list.get(2); // 獲取索引2的元素
System.out.println(element); // C
2. E set(int index, E element)
- 功能:用
element
替換指定索引index
處的元素,返回被替換的舊元素。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
String old = list.set(1, "X"); // 替換索引1的元素為"X"
System.out.println(old); // B
System.out.println(list); // [A, X, C]
四、判斷與查詢(判斷狀態、查找元素)
判斷元素是否存在、獲取元素索引等。
1. boolean contains(Object o)
- 功能:判斷List中是否包含元素
o
(通過equals()
判斷,null
用==
)。 - 示例:
List<String> list = Arrays.asList("A", "B", "C");
boolean hasB = list.contains("B"); // true
boolean hasX = list.contains("X"); // false
2. int indexOf(Object o)
- 功能:返回元素
o
在List中首次出現的索引;若不存在,返回-1
。 - 示例:
List<String> list = Arrays.asList("A", "B", "A");
int firstA = list.indexOf("A"); // 0(首次出現的索引)
int xIndex = list.indexOf("X"); // -1
3. int lastIndexOf(Object o)
- 功能:返回元素
o
在List中最后出現的索引;若不存在,返回-1
。 - 示例:
List<String> list = Arrays.asList("A", "B", "A");
int lastA = list.lastIndexOf("A"); // 2(最后出現的索引)
4. boolean isEmpty()
- 功能:判斷List是否為空(size == 0)。
- 示例:
List<String> list = new ArrayList<>();
boolean empty = list.isEmpty(); // true(剛創建的List為空)
list.add("A");
empty = list.isEmpty(); // false
5. int size()
- 功能:返回List中元素的數量。
- 示例:
List<String> list = Arrays.asList("A", "B", "C");
int size = list.size(); // 3
五、迭代器(遍歷元素)
List支持多種遍歷方式,其中迭代器是安全修改元素的方式。
1. Iterator<E> iterator()
- 功能:返回普通迭代器,支持單向遍歷(
hasNext()
、next()
)和刪除(remove()
)。 - 注意:遍歷中修改List結構(如
add
/remove
)需用迭代器的remove()
,否則拋ConcurrentModificationException
。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {String elem = iterator.next();if (elem.equals("B")) {iterator.remove(); // 安全刪除當前元素}
}
System.out.println(list); // [A, C]
2. ListIterator<E> listIterator()
- 功能:返回List特有的迭代器,支持雙向遍歷(
hasPrevious()
、previous()
)、添加(add(E e)
)、修改(set(E e)
)等。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
ListIterator<String> listIt = list.listIterator();// 正向遍歷
while (listIt.hasNext()) {System.out.print(listIt.next() + " "); // A B C
}// 反向遍歷(需先正向遍歷到末尾)
while (listIt.hasPrevious()) {System.out.print(listIt.previous() + " "); // C B A
}// 在當前位置添加元素(反向遍歷到開頭后,添加在最前面)
listIt.add("X");
System.out.println(list); // [X, A, B, C]
六、排序與反轉
通過工具類或自身方法調整元素順序。
1. void sort(Comparator<? super E> c)
(Java 8+)
- 功能:根據比較器
c
對List進行排序(ArrayList
、LinkedList
均實現)。 - 示例:
List<Integer> numbers = new ArrayList<>(Arrays.asList(3, 1, 2));
// 自然排序(從小到大)
numbers.sort(Comparator.naturalOrder());
System.out.println(numbers); // [1, 2, 3]// 自定義排序(從大到小)
numbers.sort(Comparator.reverseOrder());
System.out.println(numbers); // [3, 2, 1]
2. static void reverse(List<?> list)
(Collections
工具類)
- 功能:反轉List中元素的順序。
- 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C"));
Collections.reverse(list); // 反轉元素
System.out.println(list); // [C, B, A]
七、其他常用方法
1. List<E> subList(int fromIndex, int toIndex)
- 功能:返回List中從
fromIndex
(包含)到toIndex
(不包含)的子列表視圖(非新集合,修改子列表會影響原List,反之亦然)。 - 注意:
fromIndex
和toIndex
需滿足0 ≤ fromIndex ≤ toIndex ≤ size()
,否則拋異常。 - 示例:
List<String> list = new ArrayList<>(Arrays.asList("A", "B", "C", "D"));
List<String> sub = list.subList(1, 3); // 索引1(含)到3(不含)
System.out.println(sub); // [B, C]// 修改子列表,原List也會變化
sub.set(0, "X");
System.out.println(list); // [A, X, C, D]
2. Object[] toArray()
與 T[] toArray(T[] a)
- 功能:將List轉換為數組(詳見「數組與List相互轉換」專題)。
- 示例:
List<String> list = Arrays.asList("A", "B");
String[] array = list.toArray(new String[0]); // 轉換為String數組
System.out.println(Arrays.toString(array)); // [A, B]
八、注意事項
- 并發修改異常:使用增強for循環(
for-each
)遍歷List時,若同時調用add
/remove
(非迭代器方法),會拋ConcurrentModificationException
,需用Iterator
或ListIterator
的修改方法。 - 實現類選擇:
- 需頻繁隨機訪問(
get
):選ArrayList
(數組實現,時間復雜度O(1)
)。 - 需頻繁在首尾增刪(
add(0, e)
、remove(0)
):選LinkedList
(鏈表實現,時間復雜度O(1)
)。
- 需頻繁隨機訪問(
null
元素處理:List允許null
,contains(null)
、indexOf(null)
等方法可正常處理(用==
判斷)。
通過上述API,可完成List的大部分操作。實際開發中,需根據業務場景(如增刪頻率、訪問方式)選擇合適的實現類,并注意遍歷中的并發修改問題。