面试问题:ArrayList在遍历移除元素会出现什么情况?
import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class TestList2 { public static void main(String[] args) { List<String> list = new ArrayList<String>(); list.add("马"); list.add("张"); list.add("张"); list.add("马"); list.add("马"); // int size = list.size(); // for(int i=0; i<size; i++) { // if("张".equals(list.get(i))) { // list.remove(i); // } // } //java.lang.IndexOutOfBoundsException: Index: 4, Size: 4 //数组下标越界异常 // for(int i=0; i<list.size(); i++) { // if("张".equals(list.get(i))) { // list.remove(i); // } // } //移除结果:马 张 马 马 //遍历删除数组小标为1的张后,数组下标为2的张向前移动下标变为1, //下标为1已经遍历过所以漏删了 //以上情形两种解决方案: //变换下标 // for(int i=0; i<list.size(); i++) { // if("张".equals(list.get(i))) { // list.remove(i); // i--; // } // } //倒序移除元素,不影响数组顺序 for(int i=list.size()-1; i>-1; i--) { if("张".equals(list.get(i))) list.remove(i); } //移除结果: 马 马 马 // for(String str : list) { // if("张".equals(str)) { // list.remove(str); // } // } // java.util.ConcurrentModificationException 并发修改异常 // 原因https://www.cnblogs.com/huangjinyong/p/9455163.html //解决方案:使用Iterator迭代器的remove() // Iterator<String> iterable = list.iterator(); // while(iterable.hasNext()) { // if("张".equals(iterable.next())) { // iterable.remove(); // } // } //移除结果: 马 马 马 for(int i=0; i<list.size(); i++) { System.out.println(list.get(i)); } } }