java数组拷贝方法,java语言下面几种数组复制方法

  java数组拷贝方法,java语言下面几种数组复制方法

  00-1010深层拷贝和浅层拷贝的区别1。对于循环复制数值型复制参考型2。copy of/copy of rance copy numeric type copy reference type 3。数组复制数值型复制引用型4。克隆复制数值型复制引用型5。摘要

  00-1010假设有原数组A和被复制的数组B,如果A中的某个值发生变化,则相应变化的数组B的复制方式称为轻复制,而数组B不受影响的称为深复制。简要总结两者的概念:

  深度复制:复制后,修改原数组不会影响新数组;

  浅拷贝:拷贝后修改原数组,新数组会相应变化;

  

目录

 

  00-1010当数组中存储的元素为基本数据类型时,此时发生的是深度复制;

  //1.对于循环复制(复制数值类型)——公共静态void main(string[]args){ int[]a={ 1,2,3,4,5}的深度复制;int[]B=new int[a . length];for(int I=0;i A .长度;I){ B[I]=A[I];} system . out . println( A : arrays . tostring(A));//A : [1,2,3,4,5]system . out . println( B : arrays . tostring(B));//B: [1,2,3,4,5]system . out . println(==========修改后======);a[0]=100;system . out . println( A : arrays . tostring(A));//A : [100,2,3,4,5]system . out . println( B : arrays . tostring(B));//B : [1,2,3,4,5]} //打印对象数组的方法public static void show(num[]arrays){ for(int I=0;I数组. length;i ) { System.out.print(arrays[i])。getVal()“”);} system . out . println();} class Num { public int val=0;public Num(int val){ this . val=val;} public int getVal(){ return val;} public void set val(int val){ this . val=val;}}

  00-1010当数组中存储的元素是引用数据类型时,此时发生的是浅拷贝;

  //1.对于循环复制(复制引用数据类型)-浅复制公共静态void main(string[]args){ num[]a=new num[4];A[0]=新编号(1);A[1]=新编号(2);A[2]=新编号(3);A[3]=新编号(4);Num[] B=新编号[4];for(int I=0;i A .长度;I){ B[I]=A[I];}显示(一);//1 2 3 4 show(B);//1 2 3 4 system . out . println(=========修改后=======);答[0]。setVal(100);展示(一);//100 2 3 4 show(B);//100 2

  3 4 }

 

  

2. copyof / copyOfRange

拷贝数值类型

当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

 

  Arrays.copy(原数组,自定义新数组长度);

  Arrays.copyOfRange(原数组,from,to);

  注意拷贝截取的范围是左闭右开的[from,to)

  

//2. copy / copyOfRange (拷贝数值类型) ---深拷贝 public static void main(String[] args) { int[] A = {1,2,3,4,5}; int[] B = Arrays.copyOf(A,A.length); int[] C = Arrays.copyOfRange(A,1,3); System.out.println("A : " + Arrays.toString(A)); //A : [1, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [1, 2, 3, 4, 5] System.out.println("C : " + Arrays.toString(C)); //C : [2, 3] System.out.println("===========修改后==========="); A[0] = 100; System.out.println("A : " + Arrays.toString(A)); //A : [100, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [1, 2, 3, 4, 5] System.out.println("C : " + Arrays.toString(C)); //C : [2, 3] }

拷贝引用类型

当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

 

  

//2. copy / copyOfRange (拷贝引用类型) ---浅拷贝 public static void main(String[] args) { Num[] A = new Num[4]; A[0] = new Num(1); A[1] = new Num(2); A[2] = new Num(3); A[3] = new Num(4); Num[] B = Arrays.copyOf(A,A.length); show(A); //1 2 3 4 show(B); //1 2 3 4 System.out.println("===========修改后==========="); A[0].setVal(100); show(A); //100 2 3 4 show(B); //100 2 3 4 }class Num{ public int val = 0; public Num(int val) { this.val = val; } public int getVal() { return val; } public void setVal(int val) { this.val = val; }}

 

  

3. arraycopy

拷贝数值类型

当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

 

  System.arraycopy(src, srcPos dest, destPos, length);

  其中各个参数分别表示 如下:

  src :源数组srcPos:源数组要复制的起始位置dest:目标数组destPos:目标数组复制的起始位置length:复制的长度所以srcPos和destPos都为0,且length为源数组长度时,表示完完整整的拷贝过来了;那么截取范围拷贝也举个例子,下面的代码中srcPos = 1,destPos = 2,length = 2,表示从A数组下标为1的位置开始截取2个元素,放到B数组中下标为2的位置作为起始位置,再对比一下输出看看。

  

//3. arraycopy (拷贝数值类型) ---深拷贝 public static void main(String[] args) { int[] A = {1,2,3,4,5}; int[] B = new int[A.length]; //System.arraycopy(A,0,B,0,A.length); System.arraycopy(A,1,B,2,2); System.out.println("A : " + Arrays.toString(A)); //A : [1, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [0, 0, 2, 3, 0] System.out.println("===========修改后==========="); A[0] = 100; System.out.println("A : " + Arrays.toString(A)); //A : [100, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [0, 0, 2, 3, 0] }

拷贝引用类型

当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

 

  

//3. arraycopy (拷贝引用类型) ---浅拷贝 public static void main(String[] args) { Num[] A = new Num[4]; A[0] = new Num(1); A[1] = new Num(2); A[2] = new Num(3); A[3] = new Num(4); Num[] B = new Num[4]; System.arraycopy(A,0,B,0,A.length); show(A); //1 2 3 4 show(B); //1 2 3 4 System.out.println("===========修改后==========="); A[0].setVal(100); show(A); //100 2 3 4 show(B); //100 2 3 4 }class Num{ public int val = 0; public Num(int val) { this.val = val; } public int getVal() { return val; } public void setVal(int val) { this.val = val; }}

 

  

4. clone

拷贝数值类型

当数组中存放的元素为基本数据类型时,此时发生的是深拷贝;

 

  

//4. clone (拷贝数值类型) ---深拷贝 public static void main(String[] args) { int[] A = {1,2,3,4,5}; int[] B = A.clone(); System.out.println("A : " + Arrays.toString(A)); //A : [1, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [1, 2, 3, 4, 5] System.out.println("===========修改后==========="); A[0] = 100; System.out.println("A : " + Arrays.toString(A)); //A : [100, 2, 3, 4, 5] System.out.println("B : " + Arrays.toString(B)); //B : [1, 2, 3, 4, 5] }

拷贝引用类型

当数组中存放的元素为类的对象时,此时发生的是浅拷贝;

 

  

//4. clone (拷贝引用类型) ---浅拷贝 public static void main(String[] args) { Num[] A = new Num[4]; A[0] = new Num(1); A[1] = new Num(2); A[2] = new Num(3); A[3] = new Num(4); Num[] B = A.clone(); show(A); //1 2 3 4 show(B); //1 2 3 4 System.out.println("===========修改后==========="); A[0].setVal(100); show(A); //100 2 3 4 show(B); //100 2 3 4 }

 

  

5. 总结

拷贝方式数值类型引用类型推荐使用for循环深拷贝浅拷贝copyof深拷贝浅拷贝√arraycopy深拷贝浅拷贝√clone深拷贝浅拷贝由于arraycopy底层是C++写的,所以速度快,更多的是使用这个方法。

 

  注意:本文中所有的引用数据类型都是以类的对象为例,使用的是对象数组,我们也知道引用类型包括类,接口,字符串等等。但是需要注意字符串是新的变量,所以如果是连个字符串数组进行拷贝,即使他们是引用类型,但是每次都会创建了一个字符串数组对象, 因此, 修改原数组, 不会影响到新数组,即深拷贝。

  以上就是详解Java数组的四种拷贝方式的详细内容,更多关于Java数组拷贝的资料请关注盛行IT其它相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: