java高手进!为何第一个sBak不改变s,而第二个intArrayBak却改变了intArray ??

来源:百度知道 编辑:UC知道 时间:2024/09/25 18:33:46
Eggs:为何第一个sBak不改变s,而第二个intArrayBak却改变了intArray ??
public class TestArrayCopy
{
public static void main(String[] args)
{
String[] s = {"Microsoft","IBM","Sun","Oracle","Apple"} ;
String[] sBak = new String[5] ;
System.arraycopy(s,0,sBak,0,s.length) ;
sBak[0]="PSS" ;
for(int i=0 ;i<s.length ;i++)
{
System.out.print(s[i]+" ") ;
}
System.out.println() ;
int[][] intArray = {{1,2},{1,2,3},{3,4}} ;
int[][] intArrayBak = new int[3][] ;
System.arraycopy(intArray,0,intArrayBak,0,intArray.length) ;
intArrayBak[2][1] = 100 ;
for(int i=0 ;i<intArray.length ;i++)
{
for(int j=0 ;j<intArray[i].length ;j++)
{
System.out.print(intArray[i][j]+" ") ;
}
System.out.println() ;
}
}
}
满意继续追加分数 !!
感谢各位的回答!先来先得了,,不过String不是基本数据类型吧

因为第一个是一维数组, 所以copy过来的是5个字符串值, 两个数组之间就没有影响了.

而第二个是二维数组, 执行arraycopy,复制过来的是 3个数组的引用相当于:
int[] l1 = {1,2};
int[] l2 = {1,2,3};
int[] l3 = {3,4};
执行了arraycopy之后, intArrayBak 中的元素是这样的:
intArrayBak[0] = l1;
intArrayBak[1] = l2;
intArrayBak[2] = l3;
所以在intArrayBak[2][1] = 100; 这句话中, intArrayBak[2]保存的是{3,4}的引用, 也就是l3, 而l3是从intArray 引用而来的, 所以会改变intArray.

因为第一个是一维数组,数组里面存的是数值,第二个是数组的数组,数组里面存的是数组的引用就是说拷贝的时候拷贝的是数组的引用,你改变了引用所指向的变量的值,而两个数组指向的是同一个引用,所以原来的也就变了

说得简单点,一个变量所指向的内存地址(栈区)能放基本数据类型或者引用,赋值的时候传的或者是具体的值,或者是这个引用的值

第一个数组中存放的内容是字符串常量,以程序中的修改为例
在复制操作后s[0]指向的内容是字符串常量"Microsoft"
sBak[0]指向内容也是字符串常量"Microsoft"
sBak[0]="PSS"改变的只是sBak[0]指向内容由常量"Microsoft"换成了"PSS"

而针对intArray则是另一种状况.作为一个二维数组,intArray本质上是一个"数组的数组",在java中数组也是对象,且是一个可变的对象,因此intArray实质上也就是一个可变对象的数组..
在复制操作后intArray[2][]指向的是数组对象{3,4}
在复制操作后intBakArray[2][]指向的也是数组对象{3,4}