当前位置: 代码迷 >> J2SE >> java浅层复制不解
  详细解决方案

java浅层复制不解

热度:115   发布时间:2016-04-23 20:24:31.0
java浅层复制疑惑

public class Demo{
public static void main(String[] args) {
//1、创建一个int类型数组
int []  arr = {1,2,3,4,5};
//直接用=来复制
int [] arr1 =  arr;
//利用工具类来复制
int [] arr2 = Arrays.copyOf(arr, arr.length);
//查看结果
System.out.println(Arrays.toString(arr));//[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(arr1));//[1, 2, 3, 4, 5]
System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4, 5]
System.out.println(arr);//[I@150bd4d
System.out.println(arr1);//[I@150bd4d 地址值没改变
System.out.println(arr2);//[I@1bc4459  地址值改变了
    //修改arr[3]的值
arr[3] =100;
    System.out.println(Arrays.toString(arr));//[1, 2, 3, 100, 5]
System.out.println(Arrays.toString(arr1));//[1, 2, 3, 100, 5]
System.out.println(Arrays.toString(arr2));//[1, 2, 3, 4, 5]


这些都死浅层复制 当修改arr[3]时, 最后输出的结果 中 为啥arr1 与 arr2 不一样呢? 难度这不都是浅层复制吗???
------解决方案--------------------
arrays.copyof 调用 system.copyarray 是底层复制
创建的新数组和原来的没有任何关联 只是内容相同而已
------解决方案--------------------
Arrays的copyOf()方法传回的数组是新的数组对象;
------解决方案--------------------
我觉得最好的方法还是看源代码:
Arrays的copyof源码:

    public static int[] copyOf(int[] original, int newLength) {
        int[] copy = new int[newLength];
        System.arraycopy(original, 0, copy, 0,
                         Math.min(original.length, newLength));
        return copy;
    }

你看  int[] copy = new int[newLength];创建一个新的数组,所以说arr和arr1的首地址一致,但是和arr2的不一致。所以改了arr的100,对于arr2没影响,因为他们在不同的内存中。Myeclipse-->ctrl+shift+H-->输入类名--->找源码。
------解决方案--------------------
ary1=ary,你是把ary这个变量地址复制给了ary1,两个变量引用的是同一个数组对象
ary2,是你通过方法的调用创建出来的一个新对象,与ary是两个不同的对象,在你改变ary数组中的元素时,ary2是不会发生任何的改变。
  相关解决方案