Java中ArrayList遍历时删除元素的正确姿势

在Java编程中,ArrayList是一个非常实用的集合类,它提供了动态数组的功能。然而,当我们在遍历ArrayList的过程中删除元素时,需要特别注意一些细节。本文将通过两个示例程序来探讨如何在遍历ArrayList时正确地删除元素。

示例一:错误的方式

首先,我们来看第一个示例程序:

import java.util.ArrayList;

public class sys {
    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<>();
        a.add("小李");
        a.add("小谭同学");
        a.add("小谭先生");
        a.add("小明");
        a.add("小谭老师");
        a.add("小红");
        System.out.println(a);
        for (int i = 0; i < a.size(); i++) {
            String num = a.get(i);
            if (num.contains("小谭")) {
                a.remove(num);
            }
        }
        System.out.println(a);
    }
}

在这个示例中,我们尝试在遍历ArrayList的过程中删除所有包含"小谭"的字符串。然而,这种方法是错误的。因为在for循环中,当我们删除一个元素后,ArrayList的大小会减少,但是循环的索引i并不会自动调整。这导致在下次迭代时,原本的下一个元素会跳过,从而可能导致漏删元素

 运行结果(错误):


错误原理:

 

i=0的时候,不触发判断条件,所以正常执行程序,i++,此时=1

 

i=1的时候,刚好小谭同学满足if条件,所以从数组离开,此时i=2,小谭同学后的小谭先生补上,这样就错开了,所以不完全

 



示例二:不完全优化

接下来,我们来看第二个示例程序:

import java.util.ArrayList;

public class sys {
    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<>();
        a.add("小李");
        a.add("小谭同学");
        a.add("小谭先生");
        a.add("小明");
        a.add("小谭老师");
        a.add("小红");
        System.out.println(a);
        for (int i = 0; i < a.size(); i++) {
            String num = a.get(i);
            if (num.contains("小谭")) {
                a.remove(num);
                i--;
            }
        }
        System.out.println(a);
    }
}

 在这个修正后的示例中,我们在删除元素后立即将索引i减1。这样做的目的是为了抵消ArrayList大小减少的影响,确保在下次迭代时能够正确地访问到下一个元素。

运行结果: 

 运行原理:

 小李不满足if i++ i=1时小谭同学满足条件,所以离开数组,此时小谭先生补齐 i=2

 

此时 i--,让i回到i=1,以此类推,解决删除不完全的问题

 最佳实践

在Java中,删除ArrayList中元素的最佳实践是使用IteratorIterator提供了一个remove方法,它可以在遍历过程中安全地删除元素,同时自动调整迭代器的位置。 

import java.util.ArrayList;
import java.util.Iterator;
public class sys {
    public static void main(String[] args) {
        ArrayList<String> a = new ArrayList<>();
        a.add("小李");
        a.add("小谭同学");
        a.add("小谭先生");
        a.add("小明");
        a.add("小谭老师");
        a.add("小红");
        Iterator<String> iterator = a.iterator();
        while (iterator.hasNext()) {
            String num = iterator.next();
            if (num.contains("小谭")) {
                iterator.remove();
            }
        }
        System.out.println(a);
    }
}

 使用Iterator的方式不仅代码更简洁,而且更加安全,因为它避免了直接操作ArrayList的索引,从而减少了出错的概率。

在遍历ArrayList时删除元素,我们应该避免直接在for循环中操作,而是使用Iterator来安全地删除元素。这不仅能够避免潜在的错误,还能够写出更加优雅和可维护的代码。希望本文能够帮助您更好地理解如何在Java中正确地遍历ArrayList并删除元素。

小白记录成长,大佬勿喷,错误请指正. 

  • 22
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值