在for循环中使用ArrayList集合的remove方法存在的问题与解决方法
请看下面的一段代码,删除集合中的"abc"
public class test {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("abc");
list.add("abc");
list.add("abc");
list.add("abcr");
list.add("abc");
list.add("abcf");
list.add("abc");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("abc")) {
list.remove(i);
}
}
System.out.println(list);
}
}
输出结果:[a, abc, abcr, abcf]
为什么没有删除干净
原因:检查后发现。在for循环里,当清除掉前一个“abc”后,索引做了i++操作,删除下一个"abc"时remove方法操作的集合不是原来的list了,而是等于直接将这个“abc”跳了过去去执行后面的步骤,从而放生漏删的问题。
怎样解决呢
1、用迭代器
public class test2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("abc");
list.add("abc");
list.add("abc");
list.add("abcr");
list.add("abc");
list.add("abcf");
list.add("abc");
Iterator<String> iterator = list.iterator();
while (iterator.hasNext()) {
if (iterator.next().equals("abc")) {
iterator.remove();
}
}
System.out.println(list);
}
}
2、使用集合的removeIf方法
public class test2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("a");
list.add("abc");
list.add("abc");
list.add("abc");
list.add("abcr");
list.add("abc");
list.add("abcf");
list.add("abc");
list.removeIf(s -> s.equals("abc"));
System.out.println(list);
}
}
3、遍历集合时先不删除,先将要删除的对象存到另一个集合中,再使用removeAll方法进行删除
public class test2 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
ArrayList<String> ints = new ArrayList<>();
list.add("a");
list.add("abc");
list.add("abc");
list.add("abc");
list.add("abcr");
list.add("abc");
list.add("abcf");
list.add("abc");
for (int i = 0; i < list.size(); i++) {
if (list.get(i).equals("abc")) {
ints.add(list.get(i));
}
}
list.removeAll(ints);
System.out.println(list);
}
}