gpt4 book ai didi

java - 使用 foreach 异常从 arraylist 中删除对象仅在列表大小大于 2 时发生

转载 作者:行者123 更新时间:2023-11-30 06:21:45 27 4
gpt4 key购买 nike

我有下面的类,用于检查使用 foreach 循环从 arraylist 中删除对象

import java.util.ArrayList;

public class CheckArrayList {
/**
* @return the a
*/
public int getA() {
return a;
}

/**
* @param a
* the a to set
*/
public void setA(int a) {
this.a = a;
}

/**
* @return the b
*/
public int getB() {
return b;
}

/**
* @param b
* the b to set
*/
public void setB(int b) {
this.b = b;
}

int a;
int b;

public static void main(String[] args) {
try {
CheckArrayList checkArrayList1 = new CheckArrayList();
checkArrayList1.setA(10);
checkArrayList1.setB(20);

CheckArrayList checkArrayList2 = new CheckArrayList();
checkArrayList2.setA(30);
checkArrayList2.setB(40);

ArrayList<CheckArrayList> aList = new ArrayList<CheckArrayList>();

aList.add(checkArrayList1);
aList.add(checkArrayList2);

System.out.println("size of list before iterate = " + aList.size());
for (CheckArrayList checkArrayList : aList) {
aList.remove(checkArrayList);
System.out.println("inside loop");
}
System.out.println("size of list after iterate = " + aList.size());
} catch (Exception e) {
e.printStackTrace();
}
}
}

在执行上述操作时没有显示任何异常但它只进入循环一次。

如果我再向 ist 添加一个对象并执行相同的操作,它会显示 java.util.ConcurrentModificationException

import java.util.ArrayList;

public class CheckArrayList {
/**
* @return the a
*/
public int getA() {
return a;
}

/**
* @param a
* the a to set
*/
public void setA(int a) {
this.a = a;
}

/**
* @return the b
*/
public int getB() {
return b;
}

/**
* @param b
* the b to set
*/
public void setB(int b) {
this.b = b;
}

int a;
int b;

public static void main(String[] args) {
try {
CheckArrayList checkArrayList1 = new CheckArrayList();
checkArrayList1.setA(10);
checkArrayList1.setB(20);

CheckArrayList checkArrayList2 = new CheckArrayList();
checkArrayList2.setA(30);
checkArrayList2.setB(40);

CheckArrayList checkArrayList3 = new CheckArrayList();
checkArrayList3.setA(30);
checkArrayList3.setB(40);

ArrayList<CheckArrayList> aList = new ArrayList<CheckArrayList>();

aList.add(checkArrayList1);
aList.add(checkArrayList2);
aList.add(checkArrayList3);

System.out.println("size of list before iterate = " + aList.size());
for (CheckArrayList checkArrayList : aList) {
aList.remove(checkArrayList);
System.out.println("inside loop");
}
System.out.println("size of list after iterate = " + aList.size());
} catch (Exception e) {
e.printStackTrace();
}
}
}

为什么 arralist 大小等于 2 时不显示异常?

最佳答案

要回答为什么它不会在 2 个元素上抛出错误,您必须查看 for each 循环的实际作用。for(Type something:myList) 编译为如下内容:

Iterator<Type> iter = myList.iterator();
while(iter.hasNext()){
Type something= iter.next()
//your code
}

现在查看ArrayList 的源代码以了解实际实现。 hasNext() 的代码是:

return cursor != size; //cursor is the current position in the list

因此,当您删除循环中的元素时,size 现在为 1。当它查看是否有更多元素时,它将返回 false,因为它认为它位于循环的末尾ArrayList,此时停止执行循环。

现在看一下next()的代码:

public E next() {
checkForComodification();
//more code
}

这是实际检查修改发生的地方,所以当 size 为 3 时,它将执行第二次迭代,当它调用 next() 获取第二个元素时,它会抛出异常因为您已经在迭代器之外修改了 ArrayList。

关于java - 使用 foreach 异常从 arraylist 中删除对象仅在列表大小大于 2 时发生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040015/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com