java中在for循环中remove元素时的陷阱

如下删除集合中值为“a”的元素时:

import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List list = new ArrayList();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“1”的数据
		for (int i = 0; i < list.size(); i++) {
			if ("a".equals(list.get(i))) {
				list.remove(i);
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}

输出结果如下:

remove前集合数据:a,a,b,a,a,

remove后集合数据:a,b,a,

为什么会出现这种情况?原因是集合的大小是动态变化的,在删除第1个值为“a”的元素后,集合的大小已经发生了改变,但是i的值在删除后继续执行了加1操作,此时已经跳过了“a”元素后的元素(即原集合中第2个“a”元素)。

解决方法:

1、 在执行完remove操作后,对i的值进行减1操作,即修改后的代码如下:
import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List list = new ArrayList();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“a”的数据
		for (int i = 0; i < list.size(); i++) {
			if ("a".equals(list.get(i))) {
				list.remove(i);
				i--;
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}

2、用迭代器的方式删除数据

import java.util.*;

public class Demo {
	
	public static void main(String[] args) throws Exception {
		
		List list = new ArrayList();
		list.add("a");
		list.add("a");
		list.add("b");
		list.add("a");
		list.add("a");
		
		System.out.print("remove前集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
		
		//删除集合中值为“a”的数据
		Iterator iter = list.iterator();
		while (iter.hasNext()) {
			String temp = iter.next();
			if ("a".equals(temp)) {
				iter.remove();
			}
		}
		
		System.out.println("");
		System.out.print("remove后集合数据:");
		for (int i = 0; i < list.size(); i++) {
			System.out.print(list.get(i)+",");
		}
	}
}





你可能感兴趣的:(Java语言)