数组作为对象中的属性

e4yzc0pl  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(358)

这个问题在这里已经有答案了

如何在java中对2d数组进行深度复制(7个答案)
一年前关门了。
我对java还比较陌生,我刚刚学到这个

import java.util.Arrays;

public class Foo {

  private int[][] foo;

  public Foo(int[][] arr) {
    this.foo = arr;
  }

  @Override
  public String toString() {
    return Arrays.deepToString(this.foo).replace("],", "],\n");
  }

  public static void main(String[] args) {

    int[][] p = { { 0, 0 }, { 0, 0 } };

    Foo g = new Foo(p.clone()); // doesn't work with p nor p.clone()
    System.out.println(g);

    p[0][0] = 1;

    System.out.println(g);

  }

}

在这里,我创建了一个引用了另一个对象的对象,我可以从外部修改这个对象,因为我有一个引用,这个引用是作为参数传递给构造函数的。
虽然我理解为什么会这样,但我觉得这似乎违反了直觉。如果我将某个东西保存为对象的属性,我希望该对象有一个外部无法访问的“私有”副本。
我试着 .clone() 却无法解决。所以问题是。。。
这通常是怎么做的?我需要写一些吗 for 在构造函数中循环以获取参数中的每个值?

 (或者这不是问题?)

这个问题的最后一部分很重要,也许这是一个非问题。或者人们会做一些“事情”(一些循环来获得一个深度克隆)?

w1e3prcc

w1e3prcc1#

这里的问题是java并没有真正的二维数组。这是:

int[][] x;

是int数组的数组。它不是一个2d int数组,当然一个int数组的数组确实感觉很像2d数组。对于大多数意图和目的,它是一个2dint数组,除非它不是,而对于clone,它不是。这个 clone() 数组的impl生成一个新数组,并将每个值逐字复制到新数组中。这意味着您的int数组是克隆的,但内部int数组不是。
治疗时 int[][] “这是一个二维数组”,是的,这是不直观的。治疗时 int[][] 作为“int数组的数组”,这是非常直观的。在克隆时,您也不会期望一个arraylist数组同时克隆每个单独的arraylist。
苏。。如何深度克隆数组?了解如何在java中对2d数组进行深度复制吗?有很多选择:)

相关问题