数组练习-----数组拷贝

数组拷贝是指将一个数组的元素复制到另一个数组中。拷贝操作可以是浅拷贝或深拷贝。

数组拷贝分为浅拷贝和深拷贝

        浅拷贝是指复制数组时,数组中的元素引用(如果是引用类型)会被复制到新的数组中,但数组中的元素本身不会被复制。也就是说,两个数组中的元素是指向同一内存位置的。
        深拷贝是指复制数组时,不仅数组的引用被复制,还会创建新的对象(如果是引用类型)。这意味着新数组中的每个元素都被单独复制,原始数组和新数组不会相互影响。

拷贝的两种使用方法

(1) 使用 System.arraycopy() 方法,可以拷贝一部分或整个数组。

System.arraycopy(source, srcPos, dest, destPos, length);

source:源数组
srcPos:源数组的起始位置
dest:目标数组
destPos:目标数组的起始位置
length:要复制的元素个数


(2) 使用 clone() 方法:
对于一维数组,调用 clone() 方法会创建一个原数组的副本,属于浅拷贝。

int[] original = {1, 2, 3};
int[] copy = original.clone();  // 浅拷贝

总的来说
浅拷贝: 仅复制引用,修改一个数组中的元素会影响另一个数组。
深拷贝: 复制整个数组及其元素,两个数组互不影响。
拷贝方法: System.arraycopy() 和 clone() 都是常用的数组拷贝方式。


举一个例子说明

import java.util.Arrays;

public class TestArray {
public static void func(){
    //newArr和arr引用的是同一个数组
    //因此newArr修改空间中的内容之后,arr也可以看到修改的结果
    int[] arr = {1,2,3,4,5,6};
    int[] newArr = arr;
    newArr[0] = 10;
    System.out.println("newArr:" + Arrays.toString(arr));

    //使用Arrays中的copyOf方法完成数组的拷贝:
    //copyOf方法在进行数组拷贝时,创建了一个新的数组
    //arr和newArr引用的不是用一个数组
    arr[0] = 1;
    newArr = Arrays.copyOf(arr,arr.length);
    System.out.println("newArr:" + Arrays.toString(newArr));

    //因为arr修改其引用数组中的内容时,对newArr没有任何影响
    arr[0] = 10;
    System.out.println("newArr:" + Arrays.toString(arr));
    System.out.println("newArr:" + Arrays.toString(newArr));

    //拷贝某个范围
    int[] newArr2 = Arrays.copyOfRange(arr,2,4);
    System.out.println("newArr2:" + Arrays.toString(newArr2));

}
}

1.浅拷贝(newArr = arr;)

int[] arr = {1, 2, 3, 4, 5, 6};
int[] newArr = arr;
newArr[0] = 10;
System.out.println("newArr:" + Arrays.toString(arr));
  • arr 和 newArr 都引用同一个数组。当我们修改 newArr[0] = 10; 时,实际上是修改了 arr 数组的第一个元素,因为 arr 和 newArr 指向的是同一个内存地址
  • 结果输出:newArr:[10, 2, 3, 4, 5, 6],此时 arr 和 newArr 内容相同。
     

2.深拷贝

arr[0] = 1;
newArr = Arrays.copyOf(arr, arr.length);
System.out.println("newArr:" + Arrays.toString(newArr));
  • Arrays.copyOf(arr, arr.length) 会创建一个新的数组,将 arr 的所有元素复制到新数组 newArr 中。因此,arr 和 newArr 不再指向同一个数组,它们各自有独立的内存空间
  • 修改 arr[0] = 1; 之后,newArr 不会受到影响,仍然保持拷贝时的值。
  • 输出:newArr:[1, 2, 3, 4, 5, 6],表示 newArr 是 arr 的深拷贝。

同时我们又对原数组进行修改,对arr和newArr数组呈现不同的内容做出了展示

修改原数组时

arr[0] = 10;
System.out.println("newArr:" + Arrays.toString(arr));
System.out.println("newArr:" + Arrays.toString(newArr));

对这两个数组来说这里再次修改 arr[0] = 10;,但是由于 arr 和 newArr 已经是两个独立的数组,修改 arr 不会影响到 newArr。
所以这两个数组输出:
newArr:[10, 2, 3, 4, 5, 6]:arr 数组已经被修改。
newArr:[1, 2, 3, 4, 5, 6]:newArr 仍然保持拷贝时的状态

总的来说:

  1. 浅拷贝: 通过 newArr = arr;arr 和 newArr 引用相同的数组,修改 newArr 会影响 arr
  2. 深拷贝: 使用 Arrays.copyOf 创建新的数组,arr 和 newArr 指向不同的数组,修改其中一个不会影响另一个。
  3. 部分拷贝: 使用 Arrays.copyOfRange 可以拷贝数组的一部分。

当我们用图来表示计算机内部原理时,是这样的

浅拷贝

深拷贝

所以我们可以注意到:数组当中存储的是基本类型数据,不论怎么拷贝基本都不会出现问题

                                  如果存储的是引用数据类型,拷贝需要考虑深浅拷贝问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值