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 
版权声明:本文为博主原创文章,转载请附上博文链接!
原文地址:https://www.cnblogs.com/miye/p/10026594.html