在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
中元素的最佳实践是使用Iterator
。Iterator
提供了一个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
并删除元素。
小白记录成长,大佬勿喷,错误请指正.