A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 何拴绪 中级黑马   /  2012-6-2 00:39  /  2241 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

将数组1拷贝到数组2后,然后数组2做修改元素的值后,数组1为什么也会发生变化?

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

4 个回复

倒序浏览
这个问题是因为数据从数组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. }
复制代码
希望能帮到你

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
本帖最后由 罗文杰 于 2012-6-2 01:10 编辑

拷贝过后,两个数组应该是指向同一个地址的,你利用数组2修改了元素的值的内容,这是数组1仍然是指向这些元素的地址的,所以数组1中的元素就跟着改变了。
回复 使用道具 举报
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. }
复制代码
希望对楼主有帮助

评分

参与人数 1技术分 +1 收起 理由
攻城狮 + 1 赞一个!

查看全部评分

回复 使用道具 举报
凡延海 发表于 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 两个数组进行拷贝和上面的拷贝结果是一样的,这又是怎么回事啊?
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马