博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java数组深层复制
阅读量:5903 次
发布时间:2019-06-19

本文共 1861 字,大约阅读时间需要 6 分钟。

了解数组是对象,就应该知道,以下这个并非数组复制:

int[] scores1={1,2,3,4,5,6,7,8,9,0};		int[] scores2 = scores1;				scores2[0]=99;//scores2第一个数改为99		for(int x:scores1) {			System.out.println(x);		}//执行结果第一个数为99复制代码

这个程序片段只不过是将 scores1参考的数组对象,也给scores2参考,所以就是同一个数组。如果你要做数组复制,基本做法是另行建立新数组。例如:

int[] scores3 = new int[scores1.length];//数组是对象		for(int i=0;i

在这个程序片段中,建立一个长度与 scores1相同的新数组,再逐一访问索引元素,并指定给 scores3对应的索引位置。事实上,不用自行使用循环做值而可以使用system.arraycopy( )方法,这个方法会使用原生方式复制每个索引元素使用循环来得快:

int[] scores4 = new int[5];		System.arraycopy(scores1, 2, scores4, 0, 5);		for(int y:scores4) {			System.out.print(y);		}//执行结果:34567复制代码

System.arraycopy(scores1, 2, scores4, 0, 5);的五个参数分别是来源数组、来源起始索引、目的数组、目的索引、复制长度。JDK6以上,可以:

int[] scores5=Arrays.copyOf(scores1, scores1.length);复制代码

另外Java中数组一旦建立,长度就固定了,如果不够只有新建另行复制

int[] scores5=Arrays.copyOf(scores1, scores1.length*2);复制代码

多出的10个全部索引参考至0.

数组深层复制

class Clothes{		String color;	char size;		public Clothes(String color,char size) {				this.color=color;//color与构造函数color同名要用this		this.size=size;			}	}public class Constructor {		public static void main(String[] args) {				Clothes[] c1= {new Clothes("gray", 'M'),new Clothes("black", 'L')};		Clothes[] c2=new Clothes[c1.length];				for(int i=0;i

执行结果为red,原因在于循环执行。实际上循环中仅将c1每个索引处所参考的对象,也给c2每个索引来参考,并没有实际复制出clothes对象,术语上来说,这叫作复制参考,或称这个行为是浅层复制( ShallowCopy)。无论 System.arraycopy(scores1, 2, scores4, 0, 5);还是 Arrays.copyOf 都是浅层复制。如果真的要连同对象一同复制,你得自行操作,因为基本上只有自己才知道每个对象复制时,有哪些属性必须复制。例如:

class Clothes{		String color;	char size;		public Clothes(String color,char size) {		// TODO 自动生成的构造函数存根		this.color=color;//color与构造函数color同名要用this		this.size=size;			}	}public class Constructor {		public static void main(String[] args) {				Clothes[] c1= {new Clothes("gray", 'M'),new Clothes("black", 'L')};		Clothes[] c2=new Clothes[c1.length];				for(int i=0;i

执行结果为gray。因为Clothes c=new Clothes是新建的Clothes,并指给c2.

转载地址:http://ruypx.baihongyu.com/

你可能感兴趣的文章
PHP队列的实现
查看>>
单点登录加验证码例子
查看>>
[T-SQL]从变量与数据类型说起
查看>>
occActiveX - ActiveX with OpenCASCADE
查看>>
BeanUtils\DBUtils
查看>>
python模块--os模块
查看>>
Java 数组在内存中的结构
查看>>
《关爱码农成长计划》第一期报告
查看>>
学习进度表 04
查看>>
谈谈javascript中的prototype与继承
查看>>
时序约束优先级_Vivado工程经验与各种时序约束技巧分享
查看>>
minio 并发数_MinIO 参数解析与限制
查看>>
flash back mysql_mysqlbinlog flashback 使用最佳实践
查看>>
mysql存储引擎模式_MySQL存储引擎
查看>>
java 重写system.out_重写System.out.println(String x)方法
查看>>
配置ORACLE 11g绿色版客户端和PLSQL远程连接环境
查看>>
ASP.NET中 DataList(数据列表)的使用前台绑定
查看>>
Linux学习之CentOS(八)--Linux系统的分区概念
查看>>
System.Func<>与System.Action<>
查看>>
asp.net开源CMS推荐
查看>>