黑马程序员技术交流社区

标题: 数组拷贝问题 [打印本页]

作者: 何拴绪    时间: 2012-6-2 00:39
标题: 数组拷贝问题
将数组1拷贝到数组2后,然后数组2做修改元素的值后,数组1为什么也会发生变化?
作者: 杨海波    时间: 2012-6-2 00:59
这个问题是因为数据从数组1拷贝到数组2后,数组2储存的是数组1里面的数据的地址,所以当数组2改变后数组1会发生同步更改 下面我写了个例子 自己看看吧
  1. public class ArrayCopy {
  2.         public static void main(String[] args) {
  3.                
  4.                         int[][] array1 = {{2,3},{5,6,8},{12,0,4}};
  5.                         int[][] array2 = new int[3][];
  6.                         System.arraycopy(array1,0,array2,0,array1.length);
  7.                         array2[2][1] = 100;//改变数组元素值
  8.                         //遍历打印array2元素
  9.                         for(int i=0;i<array2.length;i++){
  10.                                 for(int j=0;j<array2[i].length;j++)
  11.                                         System.out.print(array2[i][j]+" ");
  12.                                 System.out.println("");        
  13.                         }
  14.                         //遍历打印array1元素
  15.                         for(int i=0;i<array1.length;i++){
  16.                                 for(int j=0;j<array2[i].length;j++)
  17.                                         System.out.print(array1[i][j]+" ");
  18.                                 System.out.println("");        
  19.                         }
  20.                         
  21.         }
  22. }
复制代码
希望能帮到你
作者: 罗文杰    时间: 2012-6-2 01:08
本帖最后由 罗文杰 于 2012-6-2 01:10 编辑

拷贝过后,两个数组应该是指向同一个地址的,你利用数组2修改了元素的值的内容,这是数组1仍然是指向这些元素的地址的,所以数组1中的元素就跟着改变了。
作者: 凡延海    时间: 2012-6-2 07:06
JAVA数组的复制是引用传递,这个不同于其它语言的值传递。我在这里列举三个数组拷贝的方式:
第一种呢就是直接把数组引用变量赋值给目的数组;第二种呢就是用Arrays.copyOf()方法来复制数组;第三种就是通过for循环一个元素一个元素的赋值完成数值复制,下面是我写的一个简单的例子:
  1. import java.util.Arrays;
  2. public class TestCopy{

  3.         public static void main(String[] args) {
  4.                 int [] a={1,2,3,4,5,6,7};
  5.                 int [] b=a;
  6.                 for(int i=0;i<a.length;i++)
  7.                 {
  8.                         System.out.println("a"+i+":"+a[i]+";"+"b"+i+":"+b[i]);
  9.                 }
  10.                 int c[]=Arrays.copyOf(a,a.length);
  11.                 for(int i=0;i<a.length;i++)
  12.                 {
  13.                         System.out.println("a"+i+":"+a[i]+";"+"c"+i+":"+c[i]);
  14.                 }
  15.                 int [] d=new int[a.length];
  16.                 for(int i=0;i<a.length;i++)
  17.                 {
  18.                         d[i]=a[i];
  19.                 }
  20.                 for(int i=0;i<a.length;i++)
  21.                 {
  22.                         System.out.println("a"+i+":"+a[i]+";"+"d"+i+":"+d[i]);
  23.                 }
  24.                
  25.         }

  26. }
复制代码
希望对楼主有帮助
作者: 何拴绪    时间: 2012-6-2 12:29
凡延海 发表于 2012-6-2 07:06
JAVA数组的复制是引用传递,这个不同于其它语言的值传递。我在这里列举三个数组拷贝的方式:
第一种呢就是 ...

int [] a=new int[]{1,2,3,4,5,6,7};
int [] a={1,2,3,4,5,6,7};
这两种定义方法在内存分配上有区别吗?new 两个数组进行拷贝和上面的拷贝结果是一样的,这又是怎么回事啊?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2