Java的clone()方法

想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 < array3.length; i++) {array4[i] = array3[i].clone();}System.out.println(Arrays.deepToString(array4));}
}

测试结果

[1, 2, 3, 4]
[1, 2, 3, 4]
[[1, 2, 3, 4], [2, 3, 4, 5], [4, 5, 6, 7]]
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]

测试结果验证了我们的想法!

【Java】总结Java数组的拷贝和输出相关推荐

  1. Java中字符串数组的输入与输出

    今天刷题遇到一个坑,老是接收不到字符串数组.即用str[i]=sc.nextLine();这样的方式去接收数组的话,打印的时候总是会少一个. import java.util.Scanner;publ ...

  2. Java基础:数组的声明,循环,赋值,拷贝。

    数组的声明 一般有两种形式的声明: int[] a; int a[]; 这两种声明都没错,但是大多数都使用第一种声明,因为变量名是独立的,不带任何符号. 声明一个数组,并没有将a正在的初始化为一个数组 ...

  3. Java 数组的拷贝(复制一个相同数组)

    在上一篇博客中,浅谈了 关于 java 中数组的创建,遍历,打印相关问题,这一篇想谈一谈 java 中 数组的拷贝 问题,C语言中数组是直接在内存上给相应变量一定大小的空间,对数组的赋值,改变是直接在 ...

  4. Java学习day096 并发(六)(线程安全的集合:高效的映射、集和队列、映射条目的原子更新、对并发散列映射的批操作、并发集视图、写数组的拷贝、并行数组算法、较早的线程安全集合)

    使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识. day096   并发(六)(线程安全的集合:高效的映射.集和队列.映射条目的原子更新.对并发散列映 ...

  5. Java数组赋值数组复制(拷贝)

    Java数组赋值&数组复制(拷贝) 数组赋值 数组复制 1⃣️数组赋值 值传递(基本数据类型)与引用传递(数组)区别 值传递:基本数据类型赋值,赋给变量的值就是具体的数据,而且相互不受影响: ...

  6. Java的知识点16——数组概述和特点、数组声明、初始化、数组的遍历、for-each循环、数组的拷贝

    数组的定义 数组是相同数据类型的有序集合.数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个元素,每个元素可以通过一个索引(下标)来访问它们.数组的三个基本特点 ...

  7. java二维数组存储数据,从键盘上录入学生人数,考试科目数,以及每个学生每科分数,输出每个学生的最高分、最低分、总分、平均分

    java二维数组存储数据,从键盘上录入学生人数,考试科目数,以及每个学生每科分数,输出每个学生的最高分.最低分.总分.平均分 import java.util.Scanner;/* * 二维数组存储数 ...

  8. c++ 三维数组 初始化_013 JAVA 多维数组及数组的拷贝、冒泡排序、二分法查找...

    1.多维数组 多维数组的元素又是数组,可以有二维.三维.甚至更多维数组 1.1二维数组的声明: 数据类型 [][] = new 数据类型[一维长度][二维长度] public class Test01 ...

  9. Java练习——输入n个数,存入数组,进行排序输出

    题目:输入n个数,存入数组,进行排序输出 package paixu; import java.util.Scanner; public class paixu {public static void ...

最新文章

  1. Linux shell脚本判断服务器网络是否可以上网
  2. 华为实施微服务架构的五大军规
  3. 统计学权威盘点过去50年最重要的统计学思想,因果推理、bootstrap等上榜,Judea Pearl点赞...
  4. Python pip安装命令
  5. ubuntu 安装 CUDA、 cuDNN 的tips
  6. wpe使用方法(详细)(--新加秒10图)(10号继续可用)
  7. Oracle 中启用 scott 用户 的方法
  8. mysql 双向热备份_MySQL双机热备份
  9. 设计模式1-简单工厂模式
  10. Python处理Excel文件
  11. 互联网控制协议ICMP
  12. 第一讲 linux简介
  13. in front of 与in the front of区别
  14. linux嵌入式ARM系统开发实战教程从入门到精通
  15. 搜索系统硬盘中包含指定字符串的文件的工具和方法——全文搜索、搜索文件内容(持续更新中)
  16. 酒店计算机管理系统维护合同,酒店计算机管理系统维护合同协议书范本(4页)-原创力文档...
  17. 利用JS代码完成动态生成表格案例及解析
  18. pt100铂电阻的原理及用法
  19. C++实现 1432. 棋盘挑战
  20. Java 设置系统参数和运行参数

热门文章

  1. web api 权限控制
  2. js for in 获得遍历数组索引和对象属性
  3. 在存储过程中编写正确的事务处理代码
  4. 基于.Net 写我自己的Ajax后台框架AjaxFramework
  5. 美国影视演员协会选择了Windows Azure
  6. Qomolangma实现篇(三):兼容层设计
  7. JSP的9个内置对象-session
  8. 系统提示一个程序正在被另一个程序调用,如何知道是被哪个程序调用
  9. a开头的计算机语言,我们刚开始接触计算机语言大多从Hello world 开始
  10. hyperledger fabric_鼎诚鬼才|超级账本入门(四):HYPERLEDGER 权限管理