Java集合--ArrayList遍历删除元素

面试问题: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));
        }
        
    }
    
}

 

posted @ 2019-07-12 14:49  尘世间迷茫的小书童  阅读(680)  评论(0编辑  收藏  举报