美文网首页
数组与对象的拷贝【Java拾遗】

数组与对象的拷贝【Java拾遗】

作者: 踩蘑菇的大叔 | 来源:发表于2020-03-04 23:41 被阅读0次

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

  • 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"}
  • System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)
    传参说明:arraycopy(源数组, 源数组起始位置, 目标数组, 目标数组其实位置, 拷贝长度)

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

int[]  arr1 = {1,2,3};    
int[]  arr2 = new int[5];    
System.arraycopy(arr1,0,arr2,0,3);  // arra2={1,2,3,0,0}
  • 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 序列化接口,通过对象流的序列化和反序列化来实现。

参考资料:(文章仅做交流学习,侵权即删!!)
Java - 数组拷贝的几种方式

相关文章

  • 数组与对象的拷贝【Java拾遗】

    一、数组的拷贝主要有以下几种方式。 Object.clone() 该方法继承自Object类,数组元素为基础数据类...

  • 2018-05-22

    数组与对象的深拷贝

  • C++封装(二)

    第2章 对象成员与对象数组 第3章 深拷贝与浅拷贝 浅拷贝: 深拷贝: 第4章 对象指针 对象指针: 栈中: 对象...

  • java 对象的拷贝

    拷贝:即复制 对象拷贝:即对象复制 java 对象拷贝分类:浅拷贝、深拷贝 java 对象的浅拷贝和深拷贝针对包含...

  • Javascript深拷贝

    什么是深拷贝 创建一个新的对象或数组时,将原对象/数组的“值”拷贝,而不是“引用”。 深拷贝 数组拷贝不存在多层嵌...

  • 深拷贝和浅拷贝

    1. 深拷贝和浅拷贝 1.浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引用...

  • 深浅拷贝

    浅拷贝将原对象/原数组的引用直接赋值给新对象/新数组,新对象/新数组只是原对象/原数组的一个引用。 深拷贝将原对象...

  • js深拷贝和浅拷贝区别

    浅拷贝和深拷贝的区别 1.浅拷贝:将源对象或者原数组的引用 ```直接赋给``` 新对象/新数组 ,新对象/新...

  • js 高频面试题(最新)

    1、深浅拷贝 (1) 定义 浅拷贝: 将原对象或原数组的引用直接赋给新对象,新数组,新对象/数组只是原对象的一个引...

  • 浅拷贝与深拷贝

    /*浅拷贝:拷贝地址*/ /*深拷贝:拷贝对象*/ 用Strong修饰不可变数组:浅拷贝 用Copy修饰不可变数组...

网友评论

      本文标题:数组与对象的拷贝【Java拾遗】

      本文链接:https://www.haomeiwen.com/subject/eqjglhtx.html