Java基础——Arrays

Arrays是什么?

Arrays是用于操作数组的工具类

拷贝

System.arraycopy

从原数组的srcPos位置开始,依次拷贝length个元素到目标数组的destPos位置,其为native方法

public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

copyOf

copyOf共有10个重载方法,其中8个方法针对基本数据类型数组,另外2个针对引用数据类型数组

  • 下面只举例了byte[]和2个引用数据类型的方法,其他方法都类似,具体为
  • 创建指定类型的数组
  • 调用System.arraycopy()拷贝
public static byte[] copyOf(byte[] original, int newLength) {
    byte[] copy = new byte[newLength];
    System.arraycopy(original, 0, copy, 0, Math.min(original.length, newLength));
    return copy;
}

public static <T> T[] copyOf(T[] original, int newLength) {
    return (T[]) copyOf(original, newLength, original.getClass());
}

public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
    T[] copy = ((Object)newType == (Object)Object[].class)
        ? (T[]) new Object[newLength]
        : (T[]) Array.newInstance(newType.getComponentType(), newLength);
    System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));
    return copy;
}

copyOf是深拷贝还是浅拷贝?

  • 对于基本数据类型和final修饰的引用数据类型为深拷贝
  • 对于非final修饰的引用数据类型为浅拷贝
  • 以下为验证过程

情况1

对于int,如下打印,说明新旧数组不会互相影响

  • before change, array = [1, 2, 3]
  • before change, copyArray = [1, 2, 3]
  • after change, array = [1, 2, 3]
  • after change, copyArray = [4, 2, 3]
int[] array = {1, 2, 3};
int[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));

copyArray[0] = 4;
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));

对于String,如下打印,说明新旧数组不会互相影响

  • before change, array = [1, 2, 3]
  • before change, copyArray = [1, 2, 3]
  • after change, array = [1, 2, 3]
  • after change, copyArray = [4, 2, 3]
String[] array = {"1", "2", "3"};
String[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));

copyArray[0] = "4";
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));

情况2

对于Person类

class Person {
    public int age;
    public Person(int age) {
        this.age = age;
    }
    @Override
    public String toString() {
        return age + "";
    }
}

如下打印(copyArray[0].age = 4),说明只拷贝了引用地址,未拷贝其内部数据地址

  • before change, array = [1, 2, 3]
  • before change, copyArray = [1, 2, 3]
  • after change, array = [4, 2, 3]
  • after change, copyArray = [4, 2, 3]
Person[] array = {new Person(1), new Person(2), new Person(3)};
Person[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));

copyArray[0].age = 4;
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));

但对于如下打印(copyArray[0] = new Person(4)

  • before change, array = [1, 2, 3]
  • before change, copyArray = [1, 2, 3]
  • after change, array = [1, 2, 3]
  • after change, copyArray = [4, 2, 3]
Person[] array = {new Person(1), new Person(2), new Person(3)};
Person[] copyArray = Arrays.copyOf(array, array.length);
System.out.println("before change, array = " + Arrays.toString(array));
System.out.println("before change, copyArray = " + Arrays.toString(copyArray));

copyArray[0] = new Person(4);
System.out.println("after change, array = " + Arrays.toString(array));
System.out.println("after change, copyArray = " + Arrays.toString(copyArray));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值