原文地址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. 编写Java程序,实现字符串统计和处理

    返回本章节 返回作业目录 需求说明: 在控制台输入纯字符的字符串,输出当前字符串的长度. 统计出该字符串中出现相同字母次数最多的字母(不考虑不同字母出现次数相同的情况). 将出现最多次数的字母字母替换 ...

  2. 在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决

    在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决 现象:开了vpn访问公司服务器,postman可以正常发起服务器请求,但是java代码请求失败,连接超时.包括在 ...

  3. python + pytest + allure生成测试报告

    pytest结合allure生成测试报告 环境搭建 要安装java环境,版本要是jdk1.8的,配置好java环境变量,不然输入allure命令会报错,JAVA_HOME环境,自行配置 安装allur ...

  4. linux 之 mysql数据库备份与恢复

    备份 mysqldump -uroot -p123 --databases test > ~/test.sql --databases 指定数据库 恢复 mysql -uroot -p123 & ...

  5. Django_模板中的URL参数化(四)

    去除模板中的硬编码 URL 在案例中的 test1/templates/booktest/index.html 文件里编写的链接都硬编码的链接,比如: <a href="/bookte ...

  6. nginx 超时时间配置说明

    做excel文件导入时 报 504 错误 是nginx网关超时导致 下面几个参数貌似没效果,反正我配置不起作用 这是有问题的配置属性 ,注意   于是我换了配置 ,放在http块里 ,配置生效了 #读 ...

  7. SYCOJ137斜线输出(1)

    题目-斜线输出(1) (shiyancang.cn) 在同一斜线上的满足方程.坐标关系计算即可. #include<bits/stdc++.h> using namespace std; ...

  8. RHCSA 第四天

    1.使用whereis 查找 locate命令 使用which查找whereis命令 使用locate查找rm命令    2.find命令使用: 使用find命令在当前路径下查找所有的普通文件 使用f ...

  9. leetcode 46. 全排列 及 47. 全排列 II

    46. 全排列 问题描述 给定一个没有重复数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [ [1,2,3], [1,3,2], [2,1,3], [2,3,1], [3 ...

  10. sql多行合并一列

    with a as( select * from( select 1 userId , '天津' province union select 1 userId , '北京' union select ...