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()方法,可是它多了一個操做:android

expectedModCount = modCount;

所以,在迭代器中若是要刪除元素的話,須要調用Itr類的remove方法。多線程

  將上述代碼改成下面這樣就不會報錯了:ide

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 
版權聲明:本文爲博主原創文章,轉載請附上博文連接!
相關文章
相關標籤/搜索