zoukankan      html  css  js  c++  java
  • List删除元素

    在单线程环境下的解决办法

    public void remove() {
        if (lastRet == -1)
        throw new IllegalStateException();
           checkForComodification();
     
        try {
        AbstractList.this.remove(lastRet);
        if (lastRet < cursor)
            cursor--;
        lastRet = -1;
        expectedModCount = modCount;
        } catch (IndexOutOfBoundsException e) {
        throw new ConcurrentModificationException();
        }
    }
    

     在这个方法中,删除元素实际上调用的就是list.remove()方法,但是它多了一个操作:

    expectedModCount = modCount;
    

    因此,在迭代器中如果要删除元素的话,需要调用Itr类的remove方法。

      将上述代码改为下面这样就不会报错了:

    public class Test {
        public static void main(String[] args)  {
            ArrayList<Integer> list = new ArrayList<Integer>();
            list.add(2);
            Iterator<Integer> iterator = list.iterator();
            while(iterator.hasNext()){
                Integer integer = iterator.next();
                if(integer==2)
                    iterator.remove();   //注意这个地方
            }
        }
    }
    

    在多线程环境下的解决方法

               List<String> myList = new CopyOnWriteArrayList<String>();
               myList.add( "1");
               myList.add( "2");
               myList.add( "3");
               myList.add( "4");
               myList.add( "5");
     
              new Thread(new Runnable() {
                
                   @Override
                   public void run() {
                        for (String string : myList) {
                             System.out.println("遍历集合 value = " + string);
                          
                             try {
                                  Thread.sleep(100);
                             } catch (InterruptedException e) {
                                  e.printStackTrace();
                             }
                        }
                   }
              }).start();
           
              new Thread(new Runnable() {
                
                   @Override
                   public void run() {
                     
                        for (int i = 0; i < myList.size(); i++) {
                             String value = myList.get(i);
                          
                             System.out.println("删除元素 value = " + value);
                      
                         if (value.equals( "3")) {
                              myList.remove(value);
                              i--; // 注意                           
                         }
                      
                         try {
                                  Thread.sleep(100);
                             } catch (InterruptedException e) {
                                  e.printStackTrace();
                             }
                        }
                   }
              }).start();
    
    --------------------- 
    作者:love_world_ 
    来源:CSDN 
    原文:https://blog.csdn.net/androiddevelop/article/details/21509345 
    版权声明:本文为博主原创文章,转载请附上博文链接!
    
  • 相关阅读:

    Windows终端无法通过cd切换盘符目录
    linux工程相对路径读取文件
    Ubuntu常用命令的安装
    vue项目的创建和遇到的一些问题
    超详细!Head First:HTML and CSS的读书笔记
    laravel开发环境部署遇到的问题和个人感受
    java并发:线程池之ScheduledExecutorService
    java并发:线程池之饱和策略
    java并发:线程池之ThreadPoolExecutor
  • 原文地址:https://www.cnblogs.com/miye/p/10026594.html
Copyright © 2011-2022 走看看