Java中list如何利用遍历进行删除操作

本文详细介绍了在Java中如何正确地遍历并删除List集合中的元素,包括使用for循环、增强for循环和Iterator的方式,避免了常见的下标错误和并发修改异常。

 

转:

Java中list如何利用遍历进行删除操作

Java三种遍历如何进行list的便利删除:

1、for循环:

常见初五写法:(由于下标问题达不到想要效果)

for(int i=0;i<list.size();i++){
    if(list.get(i).equals("del"))
        list.remove(i);
}

应该改为:(倒序操作避免下标问题)

int size = list.size();
for(int i=size-1;i>=0;i--){
    if(list.get(i).equals("del"))
        list.remove(i);
}

2、增强for循环(foreach循环):

常见错误:(会抛出ConcurrentModificationException)

for(String x:list){
    if(x.equals("del"))
        list.remove(x);
}

应改为:

//cowlist为原list
CopyOnWriteArrayList<Record> list = new CopyOnWriteArrayList<Record>(cowList);
for(String x:list){
    if(x.equals("del"))
        list.remove(x);
}

3、iterator遍历:(注意要是用迭代器的remove方法,不能使用list的remove方法)

Iterator<String> it = list.iterator();
while(it.hasNext()){
    String x = it.next();
    if(x.equals("del")){ it.remove(); } }

最好使用Iterator遍历。

转载于:https://www.cnblogs.com/libin6505/p/10407355.html

<think>我们正在回答用户关于如何遍历List集合的问题。根据引用,我们可以总结出多种遍历方法,并给出示例代码。 用户问题:Java 如何循环遍历 List 集合 我们将提供多种遍历方式,并说明每种方式的适用场景和注意事项。 参考引用[2][3][4][5]中提到了几种遍历方式:普通for循环、迭代器、for-each循环、Java8的Stream API等。 回答结构: 1. 普通for循环(索引遍历) 2. 迭代器(Iterator) 3. 增强for循环(for-each) 4. 使用ListIterator(双向遍历) 5. Java 8 forEach + Lambda 6. Java 8 Stream API 同时,我们将根据引用[4]中的注意事项和选择建议,给出每种方法的优缺点和适用场景。 注意:在遍历过程中修改集合的安全性问题(尤其是并发修改异常ConcurrentModificationException)需要特别说明。 最后,我们将生成相关问题。</think>在 Java遍历 `List` 集合有多种常用方式,每种方法各有特点,以下是详细说明和示例代码: ### 1. 普通 for 循环(索引遍历)[^2][^3] ```java List<String> list = Arrays.asList("A", "B", "C"); for (int i = 0; i < list.size(); i++) { String item = list.get(i); // 通过索引获取元素 System.out.println(item); } ``` - **适用场景**:需要索引操作或随机访问 - **优点**:高效访问指定位置元素 - **缺点**:仅适用于 `List` 实现类(如 `ArrayList`),不适用于 `Set` ### 2. 增强 for 循环(for-each)[^4] ```java for (String item : list) { System.out.println(item); } ``` - **适用场景**:简单遍历所有元素 - **优点**:语法简洁,无需管理索引 - **注意**:遍历中修改集合会抛出 `ConcurrentModificationException` ### 3. 迭代器(Iterator)[^3][^5] ```java Iterator<String> iterator = list.iterator(); while (iterator.hasNext()) { String item = iterator.next(); System.out.println(item); // iterator.remove(); // 安全删除当前元素 } ``` - **适用场景**:需要安全删除元素 - **优点**:支持遍历中通过 `remove()` 安全删除 - **缺点**:只能单向遍历 ### 4. ListIterator(双向遍历)[^4] ```java ListIterator<String> listIterator = list.listIterator(); // 正向遍历 while (listIterator.hasNext()) { System.out.println(listIterator.next()); } // 反向遍历 while (listIterator.hasPrevious()) { System.out.println(listIterator.previous()); } ``` - **适用场景**:需要双向遍历或修改元素 - **优点**:支持 `add()` 和 `set()` 修改元素 - **缺点**:仅适用于 `List` 实现类 ### 5. Java 8 forEach + Lambda[^4] ```java list.forEach(item -> System.out.println(item)); // 或方法引用 list.forEach(System.out::println); ``` - **适用场景**:简洁语法处理每个元素 - **优点**:代码简洁,支持并行处理 - **注意**:无法修改集合或使用 `break`/`continue` ### 6. Java 8 Stream API[^4] ```java list.stream() .filter(item -> item.startsWith("A")) .forEach(System.out::println); ``` - **适用场景**:需要链式处理(过滤/映射等) - **优点**:支持函数式操作,可并行处理 - **缺点**:创建流对象有额外开销 ### 遍历方法对比 | **方法** | **修改集合** | **索引访问** | **双向遍历** | **函数式支持** | |-------------------|-------------|-------------|-------------|---------------| | 普通 for 循环 | ❌ 不安全 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 | | 增强 for 循环 | ❌ 不安全 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | | Iterator | ✅ 安全删除 | ❌ 不支持 | ❌ 不支持 | ❌ 不支持 | | ListIterator | ✅ 安全修改 | ✅ 支持 | ✅ 支持 | ❌ 不支持 | | forEach + Lambda | ❌ 不安全 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 | | Stream API | ❌ 不安全 | ❌ 不支持 | ❌ 不支持 | ✅ 支持 | ### 选择建议 1. **只需读取元素** → 优先使用 **增强 for 循环**(最简洁) 2. **需要删除元素** → 使用 **Iterator** 的 `remove()` 方法 3. **需要索引操作** → 使用 **普通 for 循环** 4. **复杂数据处理** → 使用 **Stream API**(过滤/映射等) 5. **双向遍历需求** → 使用 **ListIterator** > ⚠️ **并发修改警告**:除迭代器外,其他方法在遍历中修改集合会抛出 `ConcurrentModificationException`。若需修改,建议使用迭代器或创建新集合[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值