想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
关注
打赏
- 【Linux】Ubuntu20.04安装和卸载MySQL8
- 【Linux】Ubuntu 20.04 报错 curl: (23) Failure writing output to destination 的解决方法
- 【Java】JUnit 4.13.2 警告 ‘assertEquals(double, double)‘ is deprecated 的解决方法
- 【JavaScript】处理 @parcel/transformer-js: Browser scripts cannot have imports or exports.
- 【Node.js】Windows环境安装配置NVM和Node.js
- 【Python】处理TypeError: Plain typing.NoReturn is not valid as type argument
- 【Python】Matplotlib可视化50例
- 【C语言】C语言修改MySQL数据库
- 【Java】从默认包导入类和对象报错的解决方法
- 【Java】panel.getGraphics()报错空指针异常的解决方法