1、提前结束遍历(直接使用列表长度进行遍历) for(inti = 0;i < list.size();i++){list.remove(i);} 在list不断地删除元素的同时,总列表list的长度也在不断缩小,i值会提前和列表的总长度相等,导致遍历提前结束,造成前面的元素删掉了,但是结束时的长度后面的元素未能删掉。 2、下标越界(提前固定列表长度进行...
System.out.println("当前list是"+list.toString()); } //原ArrayList是[1, 2, 3, 3, 4] //删除后是[1, 3, 4] 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 这种方法可以正确删除元素,因为调用remove删除元素时,remove方法调用System.arraycopy()将被删除元素a后面的元素向前移动,而不会影响元素a之前...
for(int i=list.size()-1;i>=0;i++){ if(list.get(i).equals("del")) list.remove(i); } 1. 2. 3. 4. 由于正序遍历有以上的问题,这里可以采用倒序遍历的方法。因为在倒序遍历时,即使删除了某index元素,List中 0~index-1之间的元素并未变化,下次循环时获取的index-1的元素也是正确的,因此此...
2、高级for循环出错原因 foreach其实是用迭代器来进行遍历的,而在遍历时直接使用arraylist的remove方法会导致什么问题呢? 可以再看一下fastremove和迭代器遍历的内部代码: 最后导致抛出上面异常的其实就是这个,简单说,调用list.remove()方法导致modCount和expectedModCount的值不一致而报异常 finalvoidcheckForComodificatio...
list.remove(i); i--; } } 当要针对角标进行元素的remove时,使用倒序遍历的方式最为妥当。 使用foreach删除 使用增强型for循环 foreach 删除指定元素: for(String x:list){if(x.equals("del")){ System.out.println("即将删除的元素:"+x);
//remove会导致之后的元素往前移动,而下标不改变时就会出现bug System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work } 我们在删除某个元素后,list的大小发生了变化,这时候你的的索引也会发生变化,这时就会导致你在遍历的时...
for(String id:list){if(id.contains(3)){list.remove(id);}} 运行上面的代码,抛出如下异常: image.png 抛出异常的根本原因在于for-each是使用Iterator来实现遍历的,调用ArrayList.remove()方法会将modCount+1,而Iterator内部的expectedModCount确没有更新,这样在进行下次循环时调用Iterator.next()会对modCount和...
iterator.remove(); } } 然后再进一步分析。 源码分析 先来从源码层面分析下上述 java.util.ConcurrentModificationException 异常是如何抛出的。 写一段简单的测试源码: List<String> list = new ArrayList<>(); list.add("Hello"); list.add("World"); ...
复制代码 上面的代码中,我们使用Iterator来遍历List中的元素,当找到符合条件的元素时,使用iterator.remove()来删除该元素。需要注意的是,在使用Iterator遍历时,不能直接使用List的remove方法来删除元素,因为这样会导致ConcurrentModificationException异常。 0 赞 0 踩...
1.2、直接使用list.remove(Object o) ArrayList.remove(Object o)源码的逻辑和ArrayList.remove(int index)大致相同:列表索引坐标从小到大循环遍历,若列表中存在与入参对象相等的元素,则把该元素移除,后面的元素都往左移动一位,返回true,若不存在与入参相等的元素,返回false。