理解数组的克隆方法

时间:2015-06-25 13:28:35

标签: java arrays clone cloneable

我已经了解到,对于数组,page.getTemplate() > return page.template方法表现良好,我们可以使用它。但我认为数组所持有的elemetns类型应该实现1.1.0.2接口。让我举一些例子:

clone

DEMO

我认为应该打印5次。原因是克隆数组我们正在创建包含对第一个数组所持对象的引用的新数组(因为元素的类型没有实现Cloneable)。你不能把事情弄清楚吗?

目前尚不清楚数组元素的类型是否需要实现public class test { public static void main(String[] args){ Test[] arr_t = new Test[1]; arr_t[0] = new Test(10); Test[] an_arr = arr_t.clone(); an_arr[0]= new Test(5); System.out.println(an_arr[0].test); //5 System.out.println(arr_t[0].test); //10 } public static class Test{ public int test; public Test(int test) { this.test = test; } } }

4 个答案:

答案 0 :(得分:2)

这是一个简单的概念,但似乎很难解释。克隆数组时,内存中将有两个分区数组,但索引中的值相同。

在执行an_arr的第二个数组an_array[0] = new Test(5)中,您将在插槽0中添加另一个引用。

但是克隆的索引0与克隆的数组位于不同的位置。

如果你这样做,你的例子是有效的

Test[] arr_t = new Test[1];
arr_t[0] = new Test(10);
Test[] an_arr = arr_t.clone(); 
an_arr[0].test = 5; // look here, I changed the object
System.out.println(an_arr[0].test); //5
System.out.println(arr_t[0].test);  //5

现在两者都会打印相同的值,因为它们对同一个对象具有相同的引用,但存储此引用的位置是不同的。

答案 1 :(得分:0)

.clone()制作所谓的“浅拷贝”。这意味着它在运行方法时尽可能少地复制;它不是复制数组的内容,而只是创建对原始数组内容的引用。

如果您通过调用

更改引用
new Test(5)

然后你已经覆盖了那个引用,并获得了新的数据。

替代方案是数组的深层副本。对较大的物体进行这些操作可能会很昂贵,因此它们不是默认值。

答案 2 :(得分:0)

无论数组的类型如何,数组的clone()都会做同样的事情:它会创建一个相同类型和大小的新数组,然后将每个数组元素(=)分配给每个元素新阵列。就是这样。

因此,如果arr指向一个3元素数组,而arr.clone()返回newArr,那么在创建新数组后,它只会这样做:

newArr[0] = arr[0];
newArr[1] = arr[1];
newArr[2] = arr[2];

就是这样。数组的类型不相关。没有“克隆”或元素中涉及的任何内容。它不知道(或关心)元素是否有某种克隆方法(事实上,在Java中没有用于克隆的通用API,所以这是不可能的。)

(顺便说一句,即使它以某种方式将克隆的对象放入新数组中,您的示例中的结果仍然是相同的,因为您正在为数组分配一个新值,所以无关紧要以前在那里。)

所以你的问题基本上就是为什么:

Test[] arr_t = new Test[1];
arr_t[0] = new Test(10);
Test[] an_arr = new Test[1];
an_arr[0] = arr_t[0]; 
an_arr[0] = new Test(5);
System.out.println(an_arr[0].test); //5
System.out.println(arr_t[0].test);  //10

你可以从那里弄明白。

答案 3 :(得分:0)

"问题"这是数组将引用保存到对象,而不是对象。此外,这与克隆无关。

执行时:

an_arr[0] = new Test(5);

您正在将新对象的引用分配给第一个元素。

此外,每个数组都有自己对Test对象的引用。克隆数组时,只复制引用(而不是它们引用的对象)。