List集合专项总结


List 是 Java 集合框架中有序、可重复的集合接口,它继承自 Collection 接口,提供了对元素的索引访问能力。以下是 List 集合的专项总结:
 
一、常用实现类及区别

ArrayList: 动态数组 ,随机访问快(时间复杂度 O(1));插入、删除(非末尾):慢(需移动元素,O(n));线程不安全 大量查询、少量增删的场景 。
LinkedList :双向链表 ,插入、删除快(O(1),找到位置后);随机访问慢(需遍历,O(n));线程不安全 大量增删、少量查询的场景 。
Vector :动态数组 与 ArrayList 类似,但线程安全(方法加同步锁);性能较差 多线程环境下的列表操作 。
Stack: 动态数组(Vector 子类), 基于栈结构,提供 push、pop、peek 等方法;线程安全, 需要“后进先出”逻辑的场景 。
 
二、核心方法

1. 增删改查

- 添加:
-  add(E e) :末尾添加元素。
-  add(int index, E element) :指定索引插入元素。
- 删除:
-  remove(int index) :删除指定索引的元素。
-  remove(Object o) :删除指定元素(第一个匹配项)。
- 修改:
-  set(int index, E element) :替换指定索引的元素。
- 查询:
-  get(int index) :获取指定索引的元素。
-  indexOf(Object o) :返回元素第一次出现的索引(不存在返回 -1)。
-  lastIndexOf(Object o) :返回元素最后一次出现的索引(不存在返回 -1)。
 
2. 遍历方式
 
- 普通 for 循环:通过索引遍历,适合需要操作索引的场景。
java
  
for (int i = 0; i < list.size(); i++) {
    E element = list.get(i);
    // 操作 element
}
 
- 增强 for 循环(foreach):简洁,适合仅遍历元素的场景。
java
  
for (E element : list) {
    // 操作 element
}
 
- 迭代器(Iterator):支持遍历中安全删除元素(避免并发修改异常)。
java
  
Iterator<E> iterator = list.iterator();
while (iterator.hasNext()) {
    E element = iterator.next();
    if (/* 条件 */) {
        iterator.remove(); // 安全删除
    }
}
 
- 列表迭代器(ListIterator):支持双向遍历、修改元素。
java
  
ListIterator<E> listIterator = list.listIterator();
while (listIterator.hasNext()) {
    E element = listIterator.next();
    // 操作 element
}
while (listIterator.hasPrevious()) {
    E element = listIterator.previous();
    // 反向操作 element
}
 
 
三、线程安全问题
 
-  ArrayList 、 LinkedList  是线程不安全的,多线程环境下可能出现并发修改异常。
-  Vector 、 Stack  是线程安全的(方法加  synchronized  锁),但性能较低。
- 若需在多线程中使用  ArrayList ,可通过  Collections.synchronizedList(List<T> list)  包装为线程安全的列表:
java
  
List<String> syncList = Collections.synchronizedList(new ArrayList<>());
 

四、ArrayList 扩容机制
 
- 初始容量:默认  10 (若构造时指定容量,则为指定值)。
- 扩容时机:当元素数量  size  达到当前容量时,触发扩容。
- 扩容规则:新容量 = 旧容量 ×  1.5 (通过  Arrays.copyOf  复制数组实现)。
 
五、LinkedList 特殊方法
 
作为双向链表, LinkedList  额外实现了  Deque  接口,提供队列、双端队列的操作方法:
 
- 队列操作(先进先出): offer(E e) 、 poll() 、 peek() 。
- 双端队列操作: offerFirst(E e) 、 offerLast(E e) 、 pollFirst() 、 pollLast() 、 peekFirst() 、 peekLast() 。
 
六、使用注意事项
 
1. 索引越界:调用  get 、 set 、 remove  等方法时,需确保索引在  [0, size-1]  范围内,否则抛出  IndexOutOfBoundsException 。
2. 空指针:若列表中可能存在  null  元素,操作时需判空。
3. 并发修改异常:遍历过程中若通过列表自身方法(如  add 、 remove )修改结构,会触发  ConcurrentModificationException ;建议使用迭代器的  remove  方法。
 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值