Java集合框架篇-51-集合中三种迭代方式能否删除元素的问题

      这篇,目前我们知道集合的三种遍历元素方式,分别是普通for循环,Iterator迭代器方式和for each循环。那么,这三种迭代方式是否能支持删除集合元素呢?本篇就来讨论和演示这个问题

1.普通for循环实现删除元素

package list;

import java.util.ArrayList;

public class Test1_List {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("b");
		list.add("c");
		list.add("d");
		
		//1.普通for循环删除元素
		for(int i=0; i < list.size(); i++) {
			if("b".equals(list.get(i))) {
				list.remove(i--);  //如果这里不是i--,相邻的两个b只能删除一个
			}
		}
		
		System.out.println(list);

	}

}

运行:

[a, c, d]

      简单分析下,如果上面代码remove(i--),直接写成i,那边删除一个元素之后,集合其他元素会自动往前移动位置,索引和集合的size都发生改变(减小),但是i这个类似指针的没有跟随变化,造成遗漏了删除相邻位置的第二个b元素。

2.迭代器实现

package list;

import java.util.ArrayList;
import java.util.Iterator;

public class Test1_List {

	public static void main(String[] args) {
		
		ArrayList list = new ArrayList<>();
		list.add("a");
		list.add("b");
		list.add("b");
		list.add("c");
		list.add("d");
		
		//2.迭代器实现
		Iterator it = list.iterator();
		while(it.hasNext()) {
			if("b".equals(it.next())) {
				it.remove();  // 这里不能调用集合的remove方法,否则出现并发修改异常
			}
		}
		
		System.out.println(list);

	}

}

     这种方式,需要在while循环中,删除集合元素不能使用集合list.remove(index)方法,否则报并发修改异常错误,这里使用迭代器的删除方法。

3.for each循环

      其实for each循环底层是迭代器实现的。但是上面迭代器方法已经发现不能使用集合的remove方法。所以,增强for循环只能在集合遍历元素的时候使用,不能进行遍历过程中,删除集合元素的操作。




你可能感兴趣的:(集合三种迭代方式删除元素问题)