Java 数组的拷贝(复制一个相同数组)

在上一篇博客中,浅谈了 关于 java 中数组的创建,遍历,打印相关问题,这一篇想谈一谈 java 中 数组的拷贝 问题,C语言中数组是直接在内存上给相应变量一定大小的空间,对数组的赋值,改变是直接在内存层面操作的,但是在java中因为数组是一种引用类型,创建一个数组本质是创建了一个 相应类型的对象,对数组的操作也只是通过引用对对象中相应数据的改变。

C语言中要复制一个数组就先要创建另外一个数组,在通过对数组的遍历,依次将第一个数组每个元素赋值 到 第二个数组中,java中也可以这样操作。

 public static void main(String[] args) {
    
    

        int[] a = new int[] {
    
     1, 2, 3, 4, 5, 6, 7};
        int[] b = new int[7];

        for (int i = 0; i < 7; ++i)
        {
    
    
            b[i] = a [i];
        }

        System.out.println("这是数组a: " + Arrays.toString(b));
        System.out.println("这是数组b: " + Arrays.toString(a));
    }
}

运行结果:
在这里插入图片描述
但是 在 java 中存在 这种情况 :

 public static void main(String[] args) {
    
    

        int[] a = new int[] {
    
     1, 2, 3, 4, 5, 6, 7};
        int[] b = a;   

        System.out.println("这是数组a: " + Arrays.toString(b));
        System.out.println("这是数组b: " + Arrays.toString(a));
    }
}

运行结果如下:
在这里插入图片描述
那么这真的是完成了一个数组的拷贝吗? 从运行结果来看 貌似 是这样,再来看下面这段代码:

public static void main(String[] args) {
    
    

        int[] a = new int[] {
    
     1, 2, 3, 4, 5, 6, 7};
        int[] b = a;

        System.out.println("这是数组a: " + Arrays.toString(b));
        System.out.println("这是数组b: " + Arrays.toString(a));

        //改变数组b的第一个元素
        b[0] = 10;
        System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));
        System.out.println("改变后的数组b: " + Arrays.toString(b));
    }
}

它的运行结果:
在这里插入图片描述
从代码中我们可以看到 ,改变的 是数组b的第一个元素的值,但是从输出结果来看数组a中第一个元素的值也被改变了,这是为什么呢? 你可以先思考一下再往下看。

在这里插入图片描述

要讲清楚这个问题就不得不稍微讲一下 java中创建一个 数组 背后 实际进行了哪些操作 。

public static void main(String[] args) {
    
    

        int[] a = new int[] {
    
     1, 2, 3, 4, 5, 6, 7};
        int[] b = a;
        
  }

这段代码实际是这样的
在这里插入图片描述
这就不难理解为是么执行 b[0] = 10 ; 这步操作时,为什么a[0] 也会等于10 了。
在这里插入图片描述
所以想要复制一个数组 不能 直接int[] b = a;

在Arrays 类中 有方法

static type copyOf(type[ ],int length)

这可以将一个数组的值拷贝到一个新的数组中去,length为要拷贝原数组的长度,可以小于原数组长度,此时要多长就拷贝多长,剩下的会自动截断;可以大于原数组长度,多余的会自动赋默认初始值(如果不知道赋什么初始值可以看我上一篇博客中有提到);当然也可以等于原数组长度。
具体实现如下:

public static void main(String[] args) {
    
    

        int[] a = new int[] {
    
     1, 2, 3, 4, 5, 6, 7};
        //新数组长度等于原数组长度
        int[] b = Arrays.copyOf(a,a.length);
        //新数组长度小于原数组长度,截断
        int[] c = Arrays.copyOf(a,3);
        //新数组长度大于原数组长度,多余的元素自动赋初始值
        int[] d = Arrays.copyOf(a,10);

        System.out.println("这是数组b: " + Arrays.toString(b));
        System.out.println("这是数组c: " + Arrays.toString(c));
        System.out.println("这是数组d: " + Arrays.toString(d));

        //改变数组b的第一个元素
        b[0] = 10;
        System.out.println("这是貌似没动过的数组a: " + Arrays.toString(a));
        System.out.println("改变后的数组b: " + Arrays.toString(b));
    }

运行结果如下:
在这里插入图片描述

可以看出 这种 拷贝 是创建了新的对象,执行 b[0] = 10 ; 并不会影响到原数组a[0]的值。

Arrays类中还有 一个 方法

static type copyOfRange(type[ ] a, int strat, int end)

该方法的含义是返回与类型a相同的一个数组,其长度是end-start。

小结:
java中真正拷贝一个数组的方式可以说有三种
1.通过遍历数组,依次赋值,最终拷贝一个数组。
2.运用static type copyOf(type[ ],int length) 方法。
3.运用static type copyOfRange(type[ ] a, int strat, int end) 方法。

针对初学者的总结,大佬勿喷,如果有错误还望海涵,最好在告诉我嘻嘻。

猜你喜欢

转载自blog.csdn.net/qq_46209845/article/details/113099545
今日推荐