ArrayList在遍历中删除元素的na些坑
数据封装:
ArrayList<Integer> list =new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(2);
list.add(4);
错误用法1:(删除不完全,for遍历移除多个元素时,size是会改变的,即移除一个元素,size减一,则下一次遍历到的元素实际为i+2;解决:在移除元素后,设置i--)
for(int i=0;i<list.size();i++) {
if(list.get(i)==2) {
list.remove(i);//i--;
}
}
System.out.println(list.toString());
/**output:
*[1, 2, 4]
*/
修改1:
for(int i=0;i<list.size();i++) {
if(list.get(i)==2) {
list.remove(i);
i--;
}
}
System.out.println(list.toString());
/**output:
*[1, 4]
*/
错误用法2:(迭代器中使用ArrayList.remove(),ArrayList.remove()修改了modCount值,而迭代器中的next()方法中每次调用都会检查modCount与expectedModCount是否相等,不等则表示ArrayList结构改变,抛出异常)
Iterator<Integer> it=list.iterator();
while(it.hasNext()) {
Integer i;
if((i=it.next())==2) {//chickForComodification();
list.remove(i);
}
}
System.out.println(list.toString());
/**output:
*Exception in thread "main" java.util.ConcurrentModificationException
*/
修改2:
Iterator<Integer> it=list.iterator();
while(it.hasNext()) {
if(it.next()==2) {
it.remove();
}
}
System.out.println(list.toString());
/**output:
*[1, 4]
*/
错误用法3:(for加强循环中使用ArrayList.remove(),因为for加强循环采用迭代器技术进行遍历)
for(Integer i:list) {
if(i==2) {
list.remove((Integer)i);
}
}
System.out.println(list.toString());
/**output:
*Exception in thread "main" java.util.ConcurrentModificationException
*/
修改3:
for(Integer i: new ArrayList<Integer>(list)) {
if(i==2) {
list.remove((Integer)i);
}
}
System.out.println(list.toString());
/**output:
*[1, 4]
*/