想clone(),先需要实现Cloneable接口,如此才能拷贝。
众所周知,Java中的clone()多为浅拷贝,即只复制引用,不会另外开辟完整空间重新存储的,一旦原先对象改变,拷贝后的对象也改变了。
想要实现深拷贝,固然有很多方法,不过确实有点小麻烦,这里暂不说明。
Java数组的clone()方法Java数组的clone()方法到底是深拷贝还是浅拷贝? 这个问题要分情况讨论。 下面分别说说一维数组的clone()和二维/多维数组的clone():
- 一维数组的clone()是深拷贝
- 二维数组乃至多维数组的clone()是浅拷贝
为什么这么说? 实际上,Java数组的clone()支持了深拷贝,这是对于一维数组而言的。 但我们知道,Java的二维数组并不是严格意义上的二维数组,而是一维(一维数组)数组,第一维数组的对象分别是各自的一维数组引用,从而构成了所谓的二维数组。 故而,在拷贝二维数组的时候,深拷贝了整个第一维数组,重新开辟了每一个第一维数组的空间,但每个第一维数组的对象还是一个一维数组的对象,这是个引用,所以实际上没复制过来orz。
怎么实现二维数组的深拷贝Good Question! 当然是开一层for循环,把每一个第一维数组中的数组对象都进行一下拷贝,就结束了。
怎么优雅地打印数组 错误的数组打印比如在文末提供的完整代码中,我们如果这么打印数组:
System.out.println(array2);
这看起来是对的,但我们是不是想到了数组是个引用类型啊? 引用类型的toString(),嘿嘿,数组正好打印type@address
格式的toString(),下为一例测试结果:
[I@27973e9b
这个地址啊,每个人测都不一样啦,更何况本身就是虚拟中的虚拟orz。
一维数组的打印想要打出来,还不想暴力开循环,就使用Arrays.toString(array2)
好了。
当然不能使用Arrays.toString(array2)
了,但Arrays类提供了Arrays.deepToString(array2)
,这样就OK啦。 打印结果的格式见文末。
import java.util.Arrays;
public class ArrayCloneTest {
public static void main(String[] args) {
int[] array1 = new int[] {1, 2, 3, 4};
int[] array2 = array1.clone();
System.out.println(Arrays.toString(array2));
array1[3] = 5;
System.out.println(Arrays.toString(array2));
int[][] array3 = new int[][] {{1, 2, 3, 4}, {2, 3, 4, 5}, {3, 4, 5, 6}};
int[][] array4 = array3.clone();
array4[2][0] = 4;
array4[2][1] = 5;
array4[2][2] = 6;
array4[2][3] = 7;
System.out.println(Arrays.deepToString(array4));
array4[2][0] = 3;
array4[2][1] = 4;
array4[2][2] = 5;
array4[2][3] = 6;
for (int i = 0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?