所以我是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;)?
答案 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