java ArrayList remove 2 及正確方法


https://www.cnblogs.com/chrischennx/p/9610853.html

 

正確方式

方法一,還是fori,位置前挪了減回去就行了, remove后i--

public void testListForiRight() { List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); for (int i = 0; i < list.size(); i++) { System.out.println(list.get(i)); list.remove(i); i--; //位置前挪了減回去就行了 } }

方法二,不用ArrayList的remove方法,用Itr自己定義的remove方法,代碼如下:

@Test public void testIteratorRemove() { List<String> list = new ArrayList<>(); list.add("1"); list.add("2"); list.add("3"); Iterator<String> itr = list.iterator(); while (itr.hasNext()) { String s = itr.next(); System.out.println(s); itr.remove(); } }

為什么itr自己定義的remove就不報錯了呢?看下源碼:

public void remove() { if (lastRet < 0) throw new IllegalStateException(); //依然有校驗數量是否變更 checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; //但是變更之后重新賦值了,又相等了 expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } }

依然有 checkForComodification()校驗,但是看到后面又重新賦值了,所以又相等了。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM