我目前遇到了下列问题,使用Java 8:的ArrayList得到由调用方法操纵
我想传递一个ArrayList<String>
作为参数传递给其他方法。这种方法,除其他事项外,去除它被赋予ArrayList的对象:
public static void calledMethod(String item, ArrayList<String> list) {
list.remove(item);
}
现在我打过电话,从主这种方法是这样的:
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String item = itr.next(); //<-
calledMethod(item, list);
}
在这种情况下,JVM返回java.util.ConcurrentModificationException位于上面代码中的标记行(//<-
)。据我所知,这意味着该列表在被迭代时被修改。但是,这怎么发生?据我所知,Java通过价值而不是通过引用来传递方法参数。如果我的主要方法使用下面的代码调用calledMethod
,不会发生错误:
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String item = itr.next(); //<-
calledMethod(item, (ArrayList<String>) list.clone());
}
所以通过克隆对象calledMethod
作品。这里有什么问题?
java -version
:Java SE的运行时环境(建立1.8.0_20-B26)
我使用甲骨文的Java在Linux Mint的64位。
你是什么意思的“['list'是]实际'ArrayList'对象的引用”吗?如果你刚刚写到Java是传值的,那么这是如何实现的呢? – s3lph 2014-10-01 21:04:42
引用本身是按值传递的。这就是为什么不同方法中的'list's引用相同的'ArrayList'。就好像对象是通过引用传递的,但是它是通过值传递的引用。 – rgettman 2014-10-01 21:06:28
@the_Seppi:“reference”意思是“指向对象的指针”。 'List','ArrayList'等是*引用类型*。 Java中的所有非基元类型都是引用类型。所以'list'是一个指针。复制一个指针会产生指向同一个对象的另一个指针。 – newacct 2014-10-02 01:16:14