ListmyList = new ArrayList (); myList.add( '1'); myList.add( '2'); myList.add( '3'); myList.add( '4'); myList.add( '5');
Iteratorit = myList.iterator(); while (it.hasNext()) { String value = it.next(); if (value.equals( '3')) { myList.remove(value); // error } } for (Iterator it = myList.iterator(); it.hasNext();) { String value = it.next(); if (value.equals( '3')) { myList.remove(value); // error } } for (String value : myList) { System. out.println( 'List Value:' value); if (value.equals( '3')) { myList.remove(value); // error } }
public class ArrayListextends AbstractList implements Cloneable, Serializable, RandomAccess { @Override public boolean remove(Object object) { Object[] a = array; int s = size; if (object != null) { for (int i = 0; i < s; i ) { if (object.equals(a[i])) { System.arraycopy(a, i 1, a, i, --s - i); a[s] = null; // Prevent memory leak size = s; modCount ; // 只要刪除成功都是累加 return true; } } } else { for (int i = 0; i < s; i ) { if (a[i] == null) { System.arraycopy(a, i 1, a, i, --s - i); a[s] = null; // Prevent memory leak size = s; modCount ; // 只要刪除成功都是累加 return true; } } } return false; } @Override public Iterator iterator() { return new ArrayListIterator(); } private class ArrayListIterator implements Iterator { ...... // 全局修改總數(shù)保存到當前類中 /** The expected modCount value */ private int expectedModCount = modCount; @SuppressWarnings('unchecked') public E next() { ArrayList ourList = ArrayList.this; int rem = remaining; // 如果創(chuàng)建時的值不相同,拋出異常 if (ourList.modCount != expectedModCount) { throw new ConcurrentModificationException(); } if (rem == 0) { throw new NoSuchElementException(); } remaining = rem - 1; return (E) ourList.array[removalIndex = ourList.size - rem]; } ...... }}
// 1 使用Iterator提供的remove方法,用于刪除當前元素 for (Iteratorit = myList.iterator(); it.hasNext();) { String value = it.next(); if (value.equals( '3')) { it.remove(); // ok } } System. out.println( 'List Value:' myList.toString()); // 2 建一個集合,記錄需要刪除的元素,之后統(tǒng)一刪除 List templist = new ArrayList (); for (String value : myList) { if (value.equals( '3')) { templist.remove(value); } } // 可以查看removeAll源碼,其中使用Iterator進行遍歷 myList.removeAll(templist); System. out.println( 'List Value:' myList.toString()); // 3. 使用線程安全CopyOnWriteArrayList進行刪除操作 List myList = new CopyOnWriteArrayList (); myList.add( '1'); myList.add( '2'); myList.add( '3'); myList.add( '4'); myList.add( '5'); Iterator it = myList.iterator(); while (it.hasNext()) { String value = it.next(); if (value.equals( '3')) { myList.remove( '4'); myList.add( '6'); myList.add( '7'); } } System. out.println( 'List Value:' myList.toString()); // 4. 不使用Iterator進行遍歷,需要注意的是自己保證索引正常 for ( int i = 0; i < myList.size(); i ) { String value = myList.get(i); System. out.println( 'List Value:' value); if (value.equals( '3')) { myList.remove(value); // ok i--; // 因為位置發(fā)生改變,所以必須修改i的位置 } } System. out.println( 'List Value:' myList.toString());
final ListmyList = createTestData(); 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 (Iterator it = myList.iterator(); it.hasNext();) { String value = it.next(); System.out.println('刪除元素 value = ' value); if (value.equals( '3')) { it.remove(); } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }).start();
ListmyList = new CopyOnWriteArrayList (); 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();