我目前使用Java 8遇到以下问题:
我想将ArrayList<String>as参数传递给另一个方法.除其他外,此方法从给定的ArrayList中删除一个对象:
public static void calledMethod(String item, ArrayList<String> list) {
list.remove(item);
}
Run Code Online (Sandbox Code Playgroud)
现在我尝试从main调用这个方法:
ArrayList<String> list = new ArrayList<String>();
list.add("abc");
Iterator<String> itr = list.iterator();
while (itr.hasNext()) {
String item = itr.next(); //<-
calledMethod(item, list);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,JVM 在上面代码()中的标记行返回java.util.ConcurrentModificationException//<-.据我所知,这意味着列表在迭代时被修改.但这怎么可能发生呢?据我所知,Java通过值手工方法参数,而不是通过引用.如果我calledMethod在main方法中使用以下代码调用,则不会发生错误:
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());
}
Run Code Online (Sandbox Code Playgroud)
所以将克隆的对象传递给calledMethod工作.这有什么不对?
java -version:Java SE运行时环境(版本1.8.0_20-b26)
我在Linux Mint 64bit上使用Oracle Java.
是的,Java是通过价值传递的.但是什么list呢?它是对实际ArrayList对象的引用.当它被传递给方法时,它被复制,但副本仍然引用同一个对象,因此方法的修改对于调用方法是可见的,并且ConcurrentModificationException发生了.
克隆对象时,只有该对象的副本,防止ConcurrentModificationException.
| 归档时间: |
|
| 查看次数: |
214 次 |
| 最近记录: |