JAVA对数组的四种拷贝方式

数组拷贝的四种方式

  • for
  • clone
  • System.arraycopy
  • arrays.copyof

数组拷贝方式之一——for()

就是for循环咯!!!

1
2
3
4
5
/** 1 for 循环拷贝*/
int[] arr1 = new int[len];
for (int i = 0; i < len; i++) {
arr1[i] = arr0[i];
}

也是浅拷贝咯!

数组拷贝方式之二——clone()

(主要参考)细说 Java 的深拷贝和浅拷贝
  在 Java 中,所有的 Class 都继承自 Object ,而在 Object 上,存在一个 clone() 方法,它被声明为了 protected ,所以我们可以在其子类中,使用它。而无论是浅拷贝还是深拷贝,都需要实现 clone() 方法,来完成操作。
  首先需要说明的是,clone()是浅拷贝的方式!!!其次,我们应该如何实现深拷贝呢,有两种方法:

  • 用多层浅拷贝达到深拷贝的目的,要知道,浅拷贝和深拷贝的区别就是在处理对象引用时,浅拷贝不会创造新的对象,而深拷贝会,但是如果一个对象的属性变成了基本类型数据,那么浅拷贝同样会创造新的对象,所以说,多层浅拷贝就能达到深拷贝的目的,例如:
    clone深拷贝的demo.jpg
    clone的demo_test.jpg
    在对fatherClass和childClass进行两级浅拷贝之后,fatherB就有浅拷贝变成了深拷贝,因为此时基本数据类型和Child对象都是指向不同的地址的,也就是二者都是不同的对象,所以就是达到了深拷贝的目的了。

  • 序列化(serialization)这个对象,再反序列化回来,就可以得到这个新的对象,无非就是序列化的规则需要我们自己来写。
    总结下来就是做了5件事:

    • 确保对象图中的所有类都是可序列化的
    • 创建输入输出流
    • 使用这个输入输出流来创建对象输入和对象输出流
    • 将你想要拷贝的对象传递给对象输出流
    • 从对象输入流中读取新的对象并且转换回你所发送的对象的类

最后,推一个序列化实现深拷贝的例子:序列化的方式使得其变为深拷贝

数组拷贝方式之三——System.arraycopy()

native方法,依旧是一个浅拷贝——–> 详细传送门

数组拷贝方式之四——arrays.copyof()

1
2
3
4
5
6
7
8
9
10
11
public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {
@SuppressWarnings("unchecked")
//根据class的类型是否是 Object[] 来决定是 new 还是反射去构造一个泛型数组
T[] copy = ((Object)newType == (Object)Object[].class)
? (T[]) new Object[newLength]
: (T[]) Array.newInstance(newType.getComponentType(), newLength);
//使用 native 方法批量赋值元素至新数组中。
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}

你看看,底层也在用System.arraycopy()这个native方法,所以就不再赘述了,这个在ArrayList源码分析中也有涉及哦!!!!

深浅拷贝的区别:

https://blog.csdn.net/baiye_xing/article/details/71788741?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

Thank you for your accept. mua!
-------------本文结束感谢您的阅读-------------