Java ArrayList被调用的方法操纵

Java ArrayList被调用的方法操纵,java,arraylist,Java,Arraylist,我目前在使用Java 8时遇到以下问题: 我想将ArrayList作为参数传递给另一个方法。除其他外,此方法从给定的ArrayList中删除对象: public static void calledMethod(String item, ArrayList<String> list) { list.remove(item); } 因此,将克隆对象传递给calledMethod是可行的。这里怎么了 java-version:java SE运行时环境(build 1.8.0_

我目前在使用Java 8时遇到以下问题:

我想将
ArrayList
作为参数传递给另一个方法。除其他外,此方法从给定的ArrayList中删除对象:

public static void calledMethod(String item, ArrayList<String> list) {
    list.remove(item);
}
因此,将克隆对象传递给
calledMethod
是可行的。这里怎么了


java-version
:java SE运行时环境(build 1.8.0_20-b26)


我正在Linux Mint 64位上使用Oracle Java。

是的,Java是按值传递的。但是什么是
列表
?它是对实际
ArrayList
对象的引用。当它被传递给方法时,它会被复制,但是副本仍然引用同一个对象,因此方法的修改对调用方法可见,并且会发生
ConcurrentModificationException


克隆对象时,只有这样才能创建对象的副本,从而防止出现
ConcurrentModificationException

是的,Java是按值传递的。但是什么是
列表
?它是对实际
ArrayList
对象的引用。当它被传递给方法时,它会被复制,但是副本仍然引用同一个对象,因此方法的修改对调用方法可见,并且会发生
ConcurrentModificationException


克隆对象时,只有复制对象,才能防止出现
ConcurrentModificationException

是的,您通过值传递对象,但在这种情况下,您传递的是实际传递对象引用的对象。因此,您仍然在修改calledMethod中的actualy列表。

是的,您通过值传递它,但在这种情况下,您传递的是一个实际传递对象引用的对象。因此,您仍然在修改calledMethod中的actualy列表。

这里发生的是,由于列表上的“并发”修改,您的迭代器“丢失”(它实际上不是并发的,但它是在不通知迭代器的情况下对列表进行的修改。因此,从迭代器的角度来看,它就像列表是同时被修改的一样)

在遍历列表时,不应使用list.remove删除元素。请改用Iterator.remove,这样迭代器就不会因为删除而处于无效状态:

Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();
    itr.remove(); // will remove "item" and keep iterator in a correct state
}
Iterator itr=list.Iterator();
while(itr.hasNext()){
String item=itr.next();
itr.remove();//将删除“项”并使迭代器保持正确状态
}

这里发生的事情是,由于列表上的“并发”修改,您的迭代器“丢失了”(实际上不是并发的,但它是在没有通知迭代器的情况下对列表进行的修改。因此,从迭代器的角度看,似乎列表是同时修改的)

在遍历列表时,不应使用list.remove删除元素。请改用Iterator.remove,这样迭代器就不会因为删除而处于无效状态:

Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();
    itr.remove(); // will remove "item" and keep iterator in a correct state
}
Iterator itr=list.Iterator();
while(itr.hasNext()){
String item=itr.next();
itr.remove();//将删除“项”并使迭代器保持正确状态
}

您所说的“[
list
是]对实际
ArrayList
对象的引用”是什么意思?如果Java像您刚才写的那样是按值传递的,这怎么可能呢?引用本身是按值传递的。这就是为什么不同方法中的
list
s都引用相同的
ArrayList
。这就好像对象是按引用传递的,但它是按值传递的引用。@u Seppi:“reference”的意思是“指向对象的指针”。
List
ArrayList
等都是引用类型。Java中的所有非基元类型都是引用类型。因此
List
是指针。复制指针会生成指向同一对象的另一个指针。您所说的“[
List
是什么意思?”对实际
ArrayList
对象的引用“?如果Java(正如您刚才所写)是按值传递的,这怎么可能呢?引用本身是按值传递的。这就是为什么不同方法中的
list
s都引用相同的
ArrayList
。这就好像对象是按引用传递的,但它是按值传递的引用。@u Seppi:“reference”的意思是“指向对象的指针".
List
ArrayList
等都是引用类型。Java中的所有非基元类型都是引用类型。因此
List
是指针。复制指针会生成指向同一对象的另一个指针。虽然这会阻止
ConcurrentModificationException
,但OP会询问为什么会出现异常ll发生在列表被传递给移除操作的方法时;而不是为什么在迭代时从列表中移除会导致异常。“据我所知,这意味着列表在迭代时被修改了。但这怎么会发生?”=>我试图回答,虽然这将防止出现
ConcurrentModificationException
,但OP询问的是,当列表被传递给删除操作的方法时,为什么仍然会发生异常;而不是为什么在迭代时从列表中删除会导致异常。“据我所知,这意味着列表在迭代时被修改了。但这怎么会发生?”=>我正在尝试回答这个问题
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();
    itr.remove(); // will remove "item" and keep iterator in a correct state
}