日期:2014-05-20  浏览次数:20968 次

System,arraycopy 和普通数组赋值语句区别?
本帖最后由 Loghnzagn 于 2013-06-19 22:20:07 编辑
以下是我模拟俄罗斯方块销行方法的代码

方法描述:某行满了以后,将上一行赋值给下一行,顶行清空为0

public class Systemarraycopy {
public static void main(String args[]){
int[][] wall ={{0,2,1},{1,2,1},{2,2,1},{3,2,1},{4,2,1}};
for(int i = 0;i<5;i++){
int[] line = wall[i];
System.out.println(Arrays.toString(line));
}
System.out.println();
for(int i = 3;i>=1;i--){
    System.arraycopy(wall[i-1], 0, wall[i], 0, 3);
//wall[i]=wall[i-1];(如果使用注释掉的这句就会出现问题)
if(i==1)Arrays.fill(wall[0], 0);
}
for(int i = 0;i<5;i++){
int[] line = wall[i];
System.out.println(Arrays.toString(line));
}

}
}

使用System.arraycopy结果

使用wall[i]=wall[i-1]结果


上面使用arraycopy的是理想结果

但是如果把if(i==1)Arrays.fill(wall[0],0);去掉
两种方法结果一样!

为什么会出现这种情况?请高人指点啊
System.arraycopy

------解决方案--------------------
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。
src - 源数组。
srcPos - 源数组中的起始位置。
dest - 目标数组。
destPos - 目标数据中的起始位置。
length - 要复制的数组元素的数量。 

以上来自API

LZ的wall是二维数组,则wall[x]就是一个数组,后面的逻辑,相信LZ自己应该能分析出来了吧?

个人感觉,在解读一个程序碰到一个JDK封装的方法时,我们只要知道其作用即可,如果一定要知道其原理,最好也是最权威的还是要看看其源码(安装JDK都会有个src.zip的源码包的),而且这个原理的学习,应当算是另外一个“课题”(不要影响自己对当前程序的分析或理解)。

------解决方案--------------------
关于arraycopy可以看老紫竹的博客:
http://blog.csdn.net/java2000_net/article/details/4059465

在JAVA里面,可以用复制语句"A=B"给基本类型的数据传递值,但是如果A,B是两个同类型的数组,复制就相当于将一个数组变量的引用传递给另一个数组;如果一个数组发生改变,那么引用同一数组的变量也要发生改变.

另外使用复制的话除了for循环和arraycopy,还可以用clone方法