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));
            }
            
        }
        
    }
  • 相关阅读:
    线程同步 –Mutex和Semaphore
    线程同步 –AutoResetEvent和ManualResetEvent
    线程同步 – lock和Monitor
    .NET垃圾回收 – 非托管资源
    .NET垃圾回收 – 原理浅析
    反射简介—C#特性和反射
    反射简介—类型反射和晚期绑定
    Django REST framework 第一章 Serialization
    Django REST framework 简介
    Python Django 实用小案例2
  • 原文地址:https://www.cnblogs.com/mxh-java/p/11176026.html
Copyright © 2011-2022 走看看