zoukankan      html  css  js  c++  java
  • 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));
            }
            
        }
        
    }
  • 相关阅读:
    函数【二】嵌套/作用域/名称空间
    内核模块加载错误 “Invalid module format” 解决办法
    linux oops调试
    linux 工具
    makefile 嵌套
    scheduling while atomic 出现的错误
    Windows下VSCode编译调试c/c++
    window markdown 编辑器
    linux 比较命令
    openwrt 加入nand flash的支持
  • 原文地址:https://www.cnblogs.com/mxh-java/p/11176026.html
Copyright © 2011-2022 走看看