java ArrayList remove 2 及正确方法

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

 

正确方式java

方法一,仍是fori,位置前挪了减回去就好了, remove后i--this



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方法,代码以下:spa

@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就不报错了呢?看下源码:code

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()校验,可是看到后面又从新赋值了,因此又相等了。htm

相关文章
相关标签/搜索