ArrayList由被调用的方法操纵

 手机用户2602886175 发布于 2022-12-18 18:05

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

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

public static void calledMethod(String item, ArrayList list) {
    list.remove(item);
}

现在我尝试从main调用这个方法:

ArrayList list = new ArrayList();
list.add("abc");
Iterator itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();  //<-
    calledMethod(item, list);
}

在这种情况下,JVM 在上面代码()的标记行返回java.util.ConcurrentModificationException//<-.据我所知,这意味着列表在迭代时被修改.但这怎么可能发生呢?据我所知,Java通过值手工方法参数,而不是通过引用.如果我calledMethod在main方法中使用以下代码调用,则不会发生错误:

ArrayList list = new ArrayList();
list.add("abc");
Iterator itr = list.iterator();
while (itr.hasNext()) {
    String item = itr.next();  //<-
    calledMethod(item, (ArrayList) list.clone());
}

所以将克隆的对象传递给calledMethod工作.这有什么不对?


java -version:Java SE运行时环境(版本1.8.0_20-b26)

我在Linux Mint 64bit上使用Oracle Java.

1 个回答
  • 是的,Java是通过价值传递的.但是什么list呢?它是对实际ArrayList对象的引用.当它被传递给方法时,它被复制,但副本仍然引用同一个对象,因此方法的修改对于调用方法是可见的,并且ConcurrentModificationException发生了.

    克隆对象时,只有该对象的副本,防止ConcurrentModificationException.

    2022-12-18 18:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有