Java基础拾遗——数组与对象的拷贝

Posted 小流积江河,跬步至千里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础拾遗——数组与对象的拷贝相关的知识,希望对你有一定的参考价值。

一、数组的拷贝主要有以下几种方式。

1、Object.clone()

  该方法继承自Object类,数组元素为基础数据类型(boolean、char、byte、short、int、float、double、long)或String类型,均可使用。

    int[]  arr1 = {1,2,3};    int[]  arr2 = arr1.clone();  //arr2={1,2,3}

    String[] arr1 = {"a", "b"};   String[] arr2 = arr1.clone();  //arr2= {"a", "b"}

  

2、System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

  传参说明:arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组其实位置, 拷贝长度)

  该方法是本地方法,效率较高。但是使用该方法时,必须传入一个已分配内存的数组作为目标数组。

    int[]  arr1 = {1,2,3};    int[]  arr2 = new i;nt[5];    System.arraycopy(arr1,0,arr2,0,3);  // arra2={1,2,3,0,0}

 

3、Arrays.copyOf(Object src, int length) 和 Arrays.copyOfRange(Object src, int srcPos, int length)

  传参说明copyOf(源数组, 拷贝长度),copyOfRange(源数组,  源数组起始位置, 拷贝长度)

  这两个方法底层实质上也是使用的System.arraycopy方法,只是经过了一层封装。

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOf(arr1,3);  // arra2={1,2,3}

    int[]  arr1 = {1,2,3};    int[] arr2 = Arrays.copyOfRange(arr1,1,2);  // arra2={2,3}

 

二、对象的拷贝

  基本数据类型的拷贝是值的复制,新旧数组各自独立,因此拷贝后的数组再进行更新,相互不会影响。但是引用类型却不可如此使用(String类型可以使用,是因为其值为final的不可变)。因为对象创建是在堆中分配空间,而数组的拷贝只是拷贝栈中对象的引用,对象改变后,所有指向该对象的引用都会发生变化。因此对象的拷贝要实现“深度拷贝”。

  对象的拷贝,一般采用的方式是让需要拷贝的对象实现 Cloneable 接口,并重写起 clone() 方法。

  若是对象的成员包含其他对象,则必须所有对象均实现Cloneable接口,或者让组合对象实现 Serializable 序列化接口,通过对象流的序列化和反序列化来实现。

  

参考文献:(文章仅做交流学习,侵权即删!!)

1、https://blog.csdn.net/u011669700/article/details/79323251

以上是关于Java基础拾遗——数组与对象的拷贝的主要内容,如果未能解决你的问题,请参考以下文章

[Think In Java]基础拾遗1 - 对象初始化垃圾回收器继承组合代理接口抽象类

[Think In Java]基础拾遗3 - 容器I/ONIO序列化

.NET基础拾遗面向对象的实现和异常的处理基础

[Java拾遗一] XML的书写规范与解析.

.NET基础拾遗字符串集合和流2

java 学习基础知识点拾遗 导航页