zoukankan      html  css  js  c++  java
  • 数组与对象的拷贝【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

  • 相关阅读:
    scala之伴生对象的继承
    scala之伴生对象说明
    “Failed to install the following Android SDK packages as some licences have not been accepted” 错误
    PATH 环境变量重复问题解决
    Ubuntu 18.04 配置java环境
    JDBC的基本使用2
    DCL的基本语法(授权)
    ZJNU 1374
    ZJNU 2184
    ZJNU 1334
  • 原文地址:https://www.cnblogs.com/vikezhu/p/12333823.html
Copyright © 2011-2022 走看看