哪位大佬前辈知道为什么用这这种方式遍历删除会报错?
解决方案 »
- 反射类的线程安全问题
- 求助,Swing实现两点连线的问题,谢谢
- 条形码打印(斑马打印机)问题 急!!!!!
- java和.NET哪个开发桌面软件效率更高
- CSDN.南京区程序员CS大赛正在报名中...
- 小妹郁闷死了,各位大侠救命啊!关于SOCKET和多线程的问题。error J0082: Class 'Server' doesn't have a constructor that matches 'Ser
- 关于APLLET的几个小问题。
- 怎么遍历一个目录下所有的文件?
- 或许对你也有用,进去看看吧:关于怎样清除IE缓冲的问题!
- java 重写发发后,不能实现
- Eclpise写注释*后面接汉字*变小
- Java线程问题
// 先检查下标索引是是否越界
rangeCheck(index);
// ArrayList的修改次数加1
modCount++;
// 获取索引对应的元素值
E oldValue = elementData(index);
// 获取删除元素后,需要移动的元素的个数
int numMoved = size - index - 1;
if (numMoved > 0)
// 将元素进行移动拷贝
System.arraycopy(elementData, index+1, elementData, index,
numMoved);
// 最后将多出的位置设置为空,这样说明是没有引用的对象了
elementData[--size] = null; // Let gc do its work
// 返回删除的旧值
return oldValue;
}
//ArrayList中Iterator迭代器的实现
private class Itr implements Iterator<E> {
int cursor; // index of next element to return
int lastRet = -1; // index of last element returned; -1 if no such
int expectedModCount = modCount; public boolean hasNext() {
return cursor != size;
} @SuppressWarnings("unchecked")
public E next() {
checkForComodification();
int i = cursor;
if (i >= size)
throw new NoSuchElementException();
Object[] elementData = ArrayList.this.elementData;
if (i >= elementData.length)
throw new ConcurrentModificationException();
cursor = i + 1;
return (E) elementData[lastRet = i];
} 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();
}
} final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}list.remove() 这个操作,导致modCount++这步操作,将ArrayList的修改次数加1。
在初始化Itr时expectedModCount = modCount = 8 。
在执行next方法的第一步先进行了checkForComodification方法的检查,因为我们之前进行了remove操作,那么modCount数值减一,实际modCount = 7 。
modCount 数值和expectedModCount 数值不相等,抛出ConcurrentModificationException异常。
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;public class ListTest { public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
// for (Integer i : list) {
// System.out.println(i);
// list.remove(i);
// } List<Integer> list2 = new CopyOnWriteArrayList<>();
list2.add(1);
list2.add(2);
list2.add(3);
list2.add(4);
list2.add(5);
for (Integer i : list2) {
System.out.println(i);
list.remove(i);
}
}
}
list.add(3);
list.add(23);
list.add(6);
list.add(8);
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
list.remove(i);
i--;
} List<Integer> list = new ArrayList<>();
list.add(3);
list.add(23);
list.add(6);
list.add(8);
List<Integer> removeList = new ArrayList<>();
for (Integer integer : list) {
System.out.println(integer);
removeList.add(integer);
}
list.removeAll(removeList); List<Integer> list = new ArrayList<>();
list.add(3);
list.add(23);
list.add(6);
list.add(8);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
iterator.remove();
}常用的几种方式
你可以直接使用Iterator循环和Iterator.remove方法:
Iterator<Student> iterator = list.iterator();
Student student;
while (iterator.hasNext()) {
student = iterator.next();
if (student.getSno().equals(sno))
iterator.remove();
}
for (int i = list.size()-1; i >=0 ; i--) {}
如果JDK1.8以上的话,可以用removeifimport java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;/**
*
*/
public class ArrayListDemo {
public static void main(String[] args) {
List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(2);
list.add(6); for (Integer number : list) {
System.out.println(number);
} Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
Integer number = iterator.next();
if (number.equals(4)) {
try {
iterator.remove();
} catch (Exception e) {
e.printStackTrace();
}
}
} list.removeIf(new Predicate<Integer>() {
@Override
public boolean test(Integer number) {
return (number.equals(2) || number.equals(4));
}
}); for (Integer number : list) {
System.out.println(number);
}
}
}