【问题标题】:Unintended modification in JavaJava中的意外修改
【发布时间】:2021-07-15 05:58:33
【问题描述】:

我有以下 Java 代码:

List<List<Integer>> list1 = new ArrayList<List<Integer>>(rankings);
for (int i = k + 1; i < rankings.size(); i++) {
    for (int j = 0; j < rankings.get(0).size(); j++) {
        int index = rankings.get(i).indexOf(j);
        list1.get(i).set(index, map.get(j));
    }
}
// ...
int newrank = sort(list1.get(i), 0, list1.get(i).size() - 1); // sorts list1

list1 已排序,但 rankings 也已排序。我怎样才能防止这种情况发生?

我想做的只是创建rankings 的副本,这样在我对临时复制的数组进行排序时,原始副本不会受到影响。

提前致谢。

【问题讨论】:

  • 你想创建一个deep copyrankings
  • sort() 调用将对每个子列表进行排序(假设它位于代码中未显示的 i 循环内),但不会对 list1 本身进行排序。您声称的内容是错误的!
  • 什么是map??

标签: java


【解决方案1】:

new ArrayList&lt;&gt;(list) 在这里复制引用,而不是克隆对象,对一个元素进行的每一次修改都会影响两个列表。

您可以手动添加元素来克隆它:

    for (List<Integer> intList: rankings) {
        List<Integer> someIntCopy = new ArrayList<>();
        someIntCopy.addAll(intList);
        list1.add(someIntCopy);
    }

【讨论】:

    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2014-05-21
    • 2016-08-10
    • 2015-04-29
    • 2018-06-22
    相关资源
    最近更新 更多