复制数组 - 初始大小是否重要?

时间:2012-09-17 17:36:06

标签: java arrays

所以我是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 个答案:

答案 0 :(得分:9)

相反,这样做。这样可以避免创建不需要的中间数组。

int[] oneArray = {1,2,3,4,5,6,7,8,9,10};
int[] anotherOne = Arrays.copyOf(oneArray, oneArray.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);

答案 1 :(得分: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个整数的数组。

答案 2 :(得分: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个元素。

答案 3 :(得分:1)

没有

当您执行类似

的操作时
int[] one = initilize...
int[] two = initilize...
two = one;

一个的初始值由Garbage Collector

处理