Java对数组的复制[转]
原文地址http://x10232.iteye.com/blog/2230762
定义一个数组
- int[] a={3,1,4,2,5};
- int[] b=a;
int[] a={3,1,4,2,5};
int[] b=a;
数组b只是对数组a的又一个引用,即浅拷贝。
如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy
- int[] a={3,1,4,2,5};
- int[] b=a.clone();
- b[0]=10;
- 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都是对一维数组的深度复制。
对于二维数组则不一样:
- 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]);
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函数时,是对这两个引用进行了复制。
要证明,只需看下面的输出
- 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]);
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函数
- 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]);
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()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。
- protected Object clone()
protected Object clone()
3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。
- 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()方法可实现对数组的复制
- static <T> T[] copyOf(T[] original, int newLength)
- 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对数组的复制[转]的更多相关文章
- Java开发之Java对数组的复制
苏格拉底曾说过,“世界上最快乐的事,莫过于为理想而奋斗.”人生短短数十年,何不为梦想而奋斗一把?其实只要主动追求,梦想并不遥远.总有一天,你会把它攥在手里. 作为写的第一篇Java文章,展望一下开始下 ...
- java中数组的复制
数组复制使我们在编程过程中经常要使用到的,在java中数组复制我们大概能够分为两种,一种是引用复制,还有一种就是深度复制(复制后两个数组互不相干). 以下我们就通过測试的方法来具体看看什么是引用复制和 ...
- Java数组的复制
初学Java的时候,需要复制数组的时候,一下子就想到使用赋值语句“=”,例如:array1 = array2:但后来慢慢发现,这个语句并不能将array2的内容复制给array1,而是将array2的 ...
- JAVA二维数组的复制
JAVA二维数组的复制 笔者今天做一道ccf题目时,遇到要将二维数组拷贝复制时,没有用常规的那种一个一个数的复制,用的是System.arraycopy()来进行复制,下面介绍这个函数的一些注意点: ...
- java中数组复制的两种方式
在java中数组复制有两种方式: 一:System.arraycopy(原数组,开始copy的下标,存放copy内容的数组,开始存放的下标,需要copy的长度); 这个方法需要先创建一个空的存放cop ...
- Java数组的复制全解
1.将一个基本数据类型数组的引用赋值给另一个数组 public class Array_copy { int[] array1=new int[]{1,2,3,4,5,6}; int[] array2 ...
- JAVA SE回顾及思考(2)——数组的复制与动态扩展
我们知道在Java中数组是非基本类型既数组是对象(Object)的子类,所以用下面的这种方式是不能复制该对象的 public static void main(String[] args) { int ...
- 5、数组的复制(test2.java、test3.java)
对于数组的复制,在最开始的时候最容易犯的一个错误,那就是自己认为的申请一个数组,然后将已存在的数组赋值到新申请数组名上,这样是错误的,这样仅仅是将数组的地址复制了过去,并不是,将数组内的元素拷贝过去, ...
- java 数组的复制
java数组的复制分为数组地址的复制和值的复制 地址的复制: int []arrA={11,22,33,44}; //创建一个数组 int [] arrB=new int[5]; System.out ...
随机推荐
- Java面向对象程序设计作业目录(作业笔记)
持续更新中............. 我的大学笔记>>> 第1章 面向对象 >>> 1.1.5 编写Java程序,创建Dota游戏中的防御塔类,通过两个坐属性显示防 ...
- 编写Java程序,在子类老虎中重写父类动物的吃食方法
返回本章节 返回作业目录 需求说明: 在子类老虎中重写父类动物的吃食方法 实现思路: 在子类老虎中重写父类动物的吃食方法的实现思路如下: 创建各种动物的父类Animal类,在该类中定义eat()方法. ...
- javascript实现base64格式转码与解码
最近碰到一个需求,后端返回base64格式的数据,前端需要进行base64格式解码,好了,前端采用内部提供的atob函数进行解码,开完成,交付测试,然后测试小哥哥小姐姐反馈说中文乱码! 然后查了一下, ...
- Jedis 基本使用
引入 jedis 依赖: <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <!-- Dec 15, 2 ...
- CSS基础 列表相关的属性的使用
1.无序列表:就是不需要排列顺序的情况,用无序列表 语法结构:<ul> <li></li> <li></li> </ul> 特点 ...
- Java数据类型 long 与 Long 的区别 和 正确用法
1.区别 (1) long 是 基本类型 [类似于 int] Long 是 对象类型 [类似于Integer] (2) long 默认值是 0 Long 默认值是 null 2.比较方法 (1) ...
- Linux上天之路(十五)之文件查找
主要内容 精确查找 模糊查找 1. 精确查找 find - search for files in a directory hierarchy 递归地在层次目录中处理文件 查找方式: 按文件属性查找 ...
- Java实现163邮箱发送邮件到QQ邮箱
注:图片如果损坏,点击文章链接:https://www.toutiao.com/i6812973124141711876/ 先创建一个maven的普通项目 添加依赖,附在文档末尾 其中几个注意的地方 ...
- javascript实现数字整数位每三位一个逗号分隔
Number(1234567).toLocaleString(); //结果"1,234,567" Number(123456789).toLocaleString()//结果&q ...
- 移动端开发,rem单位妙用,自适应
其实我们都会,但是不会用 大家看到的都是,这样的,这样的. http://www.woshipm.com/ucd/24110.html http://www.w3cplus.com/css3/defi ...