使用System.arraycopy()实现数组之间的复制
Posted 奔跑de五花肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用System.arraycopy()实现数组之间的复制相关的知识,希望对你有一定的参考价值。
lang下 System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是: public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。 注意:src and dest都必须是同类型或者可以进行转换类型的数组. 有趣的是这个函数可以实现自己到自己复制,比如: int[] fun =0,1,2,3,4,5,6; System.arraycopy(fun,0,fun,3,3); 则结果为:0,1,2,0,1,2,6; 实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束
import java.util.Arrays;
public class SystemArrayCopyTest
public static void main(String[] args)
int [] tset1 = new int []2,3,4,5,6,7,8 ;
System.out.println(Arrays.toString(tset1));
int [] test2 = new int [tset1.length] ;
System.arraycopy(tset1, 0, test2, 0, tset1.length) ;
System.out.println(Arrays.toString(test2));
test2[0] = 8; test2[1] = 88;
System.out.println(Arrays.toString(test2));
//只修改了复制来的副本数组,原数组没有变,此时是值传递
char [][]one = new char[][]'a','b','c','d','e','f';
System.out.println(Arrays.toString(one[0]));
char [][] another = new char [2][2] ; System.arraycopy(one, 0, another, 0, 2) ;
System.out.println(Arrays.toString(another[0]));
// another[0][0] = 'x' ; another[0][1] = 'y' ;
one[0][0] = 'x' ; one[0][1] = 'y' ;
System.out.println(Arrays.toString(one[0]));
System.out.println(Arrays.toString(another[0]));
/* java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组 ,
而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。
如果是一维数组,那么元素都是基础类型(如int,double等),
使用arraycopy()方法后,是把原数组的值传给了新数组,属于值传递。而如果是二维数组,
数组的第一维装的是一个一维数组的引用,第二维里是元素数值。对二维数组应用arraycopy()方法后,
第一维的引用被复制给新数组的第一维,也就是两个数组的第一维都指向相同的“那些数组”。
而这时改变其中任何一个数组的元素的值, 其实都修改了“那些数组”的元素的值,
所以原数组和新数组的元素值都一样了。 * */
结果:
[2, 3, 4, 5, 6, 7, 8]
//一维数组的复制属于值传递 。。修改副本原来的不会变
[2, 3, 4, 5, 6, 7, 8] 原来的
[8, 88, 4, 5, 6, 7, 8] 复制来的
//二维的数组,复制结果是一维的引用变量传递给副本的一维数组了,那么两个数组的高维储存的当然是指向统一一维数组的引用变量,所以修改任意一个另一个也会改变
[a, b] 母本【0】
[a, b] 副本【0】
//修改任意一个后
[x, y] 母本【0】
[x, y] 副本【0】
以上是关于使用System.arraycopy()实现数组之间的复制的主要内容,如果未能解决你的问题,请参考以下文章