原文地址http://x10232.iteye.com/blog/2230762

定义一个数组

  1. int[] a={3,1,4,2,5};
  2. int[] b=a;
int[] a={3,1,4,2,5};
int[] b=a;

数组b只是对数组a的又一个引用,即浅拷贝。
  如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy

  1. int[] a={3,1,4,2,5};
  2. int[] b=a.clone();
  3. b[0]=10;
  4. System.out.println(b[0]+"  "+a[0]);
int[] a={3,1,4,2,5};
int[] b=a.clone();
b[0]=10;
System.out.println(b[0]+"  "+a[0]);

但是clone和System.arrayCopy都是对一维数组的深度复制。
对于二维数组则不一样:

  1. int[][] a={{3,1,4,2,5},{4,2}};
  2. int[][] b=a.clone();
  3. b[0][0]=10;
  4. System.out.println(b[0][0]+"  "+a[0][0]);
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);

输出为10  10所以clone并不能直接作用于二维数组。
  因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
  要证明,只需看下面的输出

  1. int[][] a={{3,1,4,2,5},{4,2}};
  2. int[][] b=a.clone();
  3. b[0][0]=10;
  4. System.out.println(b[0][0]+"  "+a[0][0]);
  5. System.out.println(a[0]==b[0]);
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=a.clone();
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(a[0]==b[0]);

第5句输出为true.用clone对二维数组进行复制,要在每一维上调用clone函数

  1. int[][] a={{3,1,4,2,5},{4,2}};
  2. int[][] b=new int[a.length][];
  3. for(int i=0;i<a.length;i++)
  4. {
  5. b[i]=a[i].clone();
  6. }
  7. b[0][0]=10;
  8. System.out.println(b[0][0]+"  "+a[0][0]);
  9. System.out.println(b[0]==a[0]);
int[][] a={{3,1,4,2,5},{4,2}};
int[][] b=new int[a.length][];
for(int i=0;i<a.length;i++)
{
b[i]=a[i].clone();
}
b[0][0]=10;
System.out.println(b[0][0]+"  "+a[0][0]);
System.out.println(b[0]==a[0]);

输出为10  3 false
  小结:
  数组的复制方法现在至少有四个思路:
  1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多
  2 使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。

  1. protected Object clone()
protected Object clone() 

  3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。

  1. static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

  4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制

  1. static <T> T[] copyOf(T[] original, int newLength)
  2. static <T> T[] copyOfRange(T[] original, int from, int to)
static <T> T[] copyOf(T[] original, int newLength)
static <T> T[] copyOfRange(T[] original, int from, int to)

参考文献http://jingyan.baidu.com/article/e4d08ffddbb7610fd2f60d90.html

Java对数组的复制[转]的更多相关文章

  1. Java开发之Java对数组的复制

    苏格拉底曾说过,“世界上最快乐的事,莫过于为理想而奋斗.”人生短短数十年,何不为梦想而奋斗一把?其实只要主动追求,梦想并不遥远.总有一天,你会把它攥在手里. 作为写的第一篇Java文章,展望一下开始下 ...

  2. java中数组的复制

    数组复制使我们在编程过程中经常要使用到的,在java中数组复制我们大概能够分为两种,一种是引用复制,还有一种就是深度复制(复制后两个数组互不相干). 以下我们就通过測试的方法来具体看看什么是引用复制和 ...

  3. Java数组的复制

    初学Java的时候,需要复制数组的时候,一下子就想到使用赋值语句“=”,例如:array1 = array2:但后来慢慢发现,这个语句并不能将array2的内容复制给array1,而是将array2的 ...

  4. JAVA二维数组的复制

    JAVA二维数组的复制 笔者今天做一道ccf题目时,遇到要将二维数组拷贝复制时,没有用常规的那种一个一个数的复制,用的是System.arraycopy()来进行复制,下面介绍这个函数的一些注意点: ...

  5. java中数组复制的两种方式

    在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...

  6. Java数组的复制全解

    1.将一个基本数据类型数组的引用赋值给另一个数组 public class Array_copy { int[] array1=new int[]{1,2,3,4,5,6}; int[] array2 ...

  7. JAVA SE回顾及思考(2)——数组的复制与动态扩展

    我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的 public static void main(String[] args) { int ...

  8. 5、数组的复制(test2.java、test3.java)

    对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去, ...

  9. java 数组的复制

    java数组的复制分为数组地址的复制和值的复制 地址的复制: int []arrA={11,22,33,44}; //创建一个数组 int [] arrB=new int[5]; System.out ...

随机推荐

  1. 使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果。

    查看本章节 查看作业目录 需求说明: 使用 jQuery 选择器获取页面元素,然后利用 jQuery 对象的 css() 方法设置其 display 样式属性,从而实现显示和隐藏效果. 具体要求如下: ...

  2. jsp:useBean的scope属性

    目录 1.分类 2.page 3.request 4.session 5.application 1.分类 对于jsp:useBean创建的对象,由jsp:useBean的可选属性scope指定,可以 ...

  3. Zabbix 代码执行漏洞复现 /zabbix-cve_2017_2824

    环境: 利用docker将vulfocus环境pull到本地搭建 漏洞描述: Zabbix 是由Alexei Vladishev 开发的一种网络监视.管理系统,基于 Server-Client 架构. ...

  4. DES对称加密算法实现:Java,C#,Golang,Python

    数据加密标准(DES,Data Encryption Standard,简写DES)是一种采用块密码加密的对称密钥算法,加密分组长度为64位,其中8.16.24.32.40.48.56.64 等8位是 ...

  5. RabbitMQ使用 prefetch_count优化队列的消费,使用死信队列和延迟队列实现消息的定时重试,golang版本

    RabbitMQ 的优化 channel prefetch Count 死信队列 什么是死信队列 使用场景 代码实现 延迟队列 什么是延迟队列 使用场景 实现延迟队列的方式 Queue TTL Mes ...

  6. spring security 关于 http.sessionManagement().maximumSessions(1);的探究

    1.前言 spring security 支持对session的管理 , http.sessionManagement().maximumSessions(1);的意思的开启session管理,ses ...

  7. Solon 开发,二、注入或手动获取Bean

    Solon 开发 一.注入或手动获取配置 二.注入或手动获取Bean 三.构建一个Bean的三种方式 四.Bean 扫描的三种方式 五.切面与环绕拦截 六.提取Bean的函数进行定制开发 七.自定义注 ...

  8. 【记录一个问题】go get -u github.com/go-redis/redis出现错误" invalid character '.' after top-level value"

    安装某个库的时候依赖于redis库,总是出现这样的错误: go install go: github.com/go-redis/redis/v7@v7.2.0: parsing go.mod: mis ...

  9. k8s通过Service访问Pod

    如何创建服务 1.创建Deployment #启动三个pod,运行httpd镜像,label是run:mcw-httpd,Seveice将会根据这个label挑选PodapiVersion: apps ...

  10. Sping简介

    SSH:Struct2 + Spring +Hibernate SSM:SpringMVC + Spring + Mybatis 优点 1,Sping是一个开源的免费的框架(容器) 2,Spirng是 ...