1

所以我是Java新手,所以这个问题可能看起来有点傻,但无论如何......假设我们有这样的代码:

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = new int[150];
anotherOne = Arrays.copyOf(oneArray, oneArray.length);

当我打印 anotherOne 时,无论初始大小是多少,在 copyOf 方法之后,它将是我们所说的该函数的第二个参数。在上面的例子中,数组将缩小到 10 个元素(或者指针将开始指向内存中的另一个位置,我想在那里创建了一个新的 10 元素数组?)。那么我是不是弄错了,或者 anotherOne 的初始大小根本没有意义,如果它被创建为将来某个时候成为副本,那么应该在不指定大小的情况下对其进行初始化(int [] anotherOne;)?

4

4 回答 4

9

改为这样做。这将使您免于创建不需要的中间数组。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

然而,如果你真的需要你的第二个数组是 length 150,那么你可以这样写:

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = new int[150];
System.arraycopy(oneArray, 0, anotherOne, 0, oneArray.length);
于 2012-09-17T17:38:31.027 回答
6

Arrays.copyOf已经复制了。您不需要anotherOne在此之前初始化:

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

你的代码会发生什么

  • oneArray在内存中创建一个数组
  • anotherOne在内存中创建一个 150 个整数的数组
  • Arrays.copyOf方法创建第三个数组,并使变量anotherOne指向该数组。这样做的结果是不再引用您的 150 个元素的数组,因此它将被垃圾收集。

这意味着,在实践中,您的代码将完美运行,但您正在使用 CPU 时间(和一小段时间的内存)来创建和擦除 150 个整数的数组。

于 2012-09-17T17:38:37.120 回答
2

Arrays.copyOf正在返回一个在该方法中创建的新数组。您将该新数组分配给变量anotherOne,失去对您创建的数组的引用,然后该数组将有资格进行垃圾收集。

因此,用于创建数组的大小int[] anotherOne = new int[150]; 无关紧要,初始化或使用它创建的数组也无关紧要。

您不妨使用:

int[] anotherOne = Arrays.copyOf(oneArray, oneArray.length);

或者:

int[] anotherOne;

// ...
anotherOne = Arrays.copyOf(oneArray, oneArray.length);

如果您确实需要结果至少有150 个元素,您也可以通过以下方式实现Array.copyOf

int[] anotherOne =
    Arrays.copyOf(oneArray, (oneArray.length > 150) ? oneArray.length() : 150);

现在anotherOne将至少有150 个元素。

于 2012-09-17T17:38:41.663 回答
1

不。

当你做类似的事情时

int[] one = initilize...
int[] two = initilize...
two = one;

一个的初始值由Garbage Collector

于 2012-09-17T17:39:27.213 回答