【问题标题】:ArrayList adding incorrect values [duplicate]ArrayList添加不正确的值[重复]
【发布时间】:2021-02-16 19:28:10
【问题描述】:

我正在尝试将数组添加到 ArrayList 以检查它们是否曾被见过。当我将一个数组添加到列表中时,我也想将同一数组的所有其他“循环”版本添加到列表中。但是,当我尝试更改数组的值然后添加到列表(下面的代码)时,ArrayList 只会填满原始数组的副本。

for (int k = 0; k < 12; k++) {
  int temp = values[0];
  for (int j = 0; j < 11; j++) {
    values[j] = values[j + 1];
  }
  values[11] = temp;
  seen.add(values);
}

【问题讨论】:

  • 将值复制到新数组中。
  • Sheesh 艰难的人群。这行得通,但我不明白为什么我需要这样做。
  • 如果你不创建一个新数组,你将在列表中添加对同一个数组的引用(所以它们都具有相同的值)。
  • 啊有趣。猜猜这只是 ArrayList 节省一些时间的一种方式?第一个数组被缓存了,所以每次我们添加它时,同一个数组都会被重用?
  • 它不是缓存。 ArrayList 保存对其中对象的引用。

标签: java arrays arraylist


【解决方案1】:

您有一个数组变量values,您可以在循环的每次迭代中对其进行修改。当您将对象添加到 (Array)List 时,它不会被复制 - 对它的引用只是存储在列表中。因此,当您继续修改同一个对象时,从列表中访问该对象时也会看到更改。

相反,您应该在循环的每次迭代中创建一个新数组,并将不同的对象添加到列表中:

for (int k = 0; k < 12; k++) {
  int[] temp = new int[12];
  for (int j = 0; j < 12; j++) {
    temp[j] = values[(j + 1) % 12];
  }
  seen.add(temp);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-31
    • 1970-01-01
    • 2023-04-06
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    相关资源
    最近更新 更多