数组的拷贝及对象clone
来源:互联网 发布:淘宝商城平台 编辑:程序博客网 时间:2024/06/05 22:50
1.前言
- java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(), Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。
- Java数组的复制操作可以分为深度复制和浅度复制。简单来说深度复制,可以将对象的值和对象的内容复制;浅复制是指对对象引用的复制。
2.代码详解
1. 循环拷贝(速度相对比较慢)
用一个for循环进行元素的逐个拷贝,进行深拷贝或者浅复制。
2. System.arraycopy(浅拷贝)
①系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是去新建一个新的对象。通过它的代码我们可以看到,这个方法不是用java语言写的,而是底层用c或者c++实现的,因而速度会比较快。
②对于一维数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。
System.arraycopy的函数原型:
/***src表示源数组*srcPos表示源数组要复制的起始位置*desc表示目标数组*length表示要复制的长度*/public static native void arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
System.arraycopy()复制的过程图:
Demo[] demos = new Demo[]{new Demo(1, "aa"), new Demo(2, "bb")};Demo[] demos2 =new Demo[demos.length];System.arraycopy(demos, 0, demos2, 0, demos.length);System.out.println("demos[0]="+demos[0].toString());System.out.println("demos2[0]="+demos2[0].toString());//此时demos[0]和demos2[0]的内容一致,均是"aa"demos2[0].setName("cc");System.out.println("demos2[0]="+demos2[0].toString());System.out.println("demos[0]="+demos[0].toString());//由于副本被修改为"cc",原来数组的内容也被修改为"cc"
3.Arrays.copyOf(浅拷贝)
函数原型:
public static byte[] copyOfRange(byte[] original, int from, int to) { int newLength = to - from; if (newLength < 0) throw new IllegalArgumentException(from + " > " + to); byte[] copy = new byte[newLength]; System.arraycopy(original, from, copy, 0, Math.min(original.length - from, newLength)); return copy;}
4.Object.clone
clone()比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝。
慎用 Object的 clone方法来拷贝对象。对象的 clone方法默认是浅拷贝,若想实现深拷贝需要重写 clone方法实现属性对象
的拷贝。
①对象拷贝
因为protected关键字只允许同一个包内的类和它的子类调用,所以我们声明一个object类时,肯定不是同一个包内,所以就不能去调用它。
要调用这个方法,就需要我们写一个类,然后声明实现cloneable接口就好了,不需要去显示地声明继承于object,因为java中的类如果不显示说明父类的话,默认父类就是object。然后我们继承这个方法:
@Override public Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); }
②数组拷贝
对于数组而言,它不是简单的将引用赋值为另外一个数组引用,而是创建一个新的数组。但是我们知道,对于数组本身而言,它它的元素是对象的时候,本来数组每个元素中保存的就是对象的引用,所以,拷贝过来的数组自然而言也是对象的引用,所以对于数组对象元素而言,它又是浅拷贝。
class Aby implements Cloneable{ public int i; public Aby(int i) { this.i = i; } @Override public Object clone() throws CloneNotSupportedException { // TODO Auto-generated method stub return super.clone(); }}public class Solution { public static void main(String[] args) throws CloneNotSupportedException { Aby aby1 = new Aby(1); Aby aby2 = (Aby) aby1.clone(); aby1.i = 2; System.out.println(aby1.i); //2 System.out.println(aby2.i); //1 Aby[] arr = {aby1,aby2}; Aby[] arr2 = arr.clone(); arr2[0].i = 3; System.out.println(arr[0].i); //3 System.out.println(arr2[0].i); //3 }}
- 数组的拷贝及对象clone
- 理解对象clone及数组clone
- js数组及对象的深拷贝
- 数组克隆及对象的深、浅克隆(deep clone、shallow clone)
- Java clone的浅拷贝及深拷贝 详解
- ActionScript中的不变对象及数组的深拷贝
- 数组的拷贝(System.arraycopy和clone)
- java基础之对象的clone(浅拷贝)
- java基础之对象的clone(深拷贝)
- java 重写接口Cloneable的Clone方法 拷贝对象
- 数组的拷贝及效率
- 数组的拷贝及效率
- 对象克隆以及clone()方法实现时的深拷贝和浅拷贝
- Java中Object的clone()及浅拷贝、深拷贝分析
- java学习笔记-数组,对象的拷贝
- js 数组对象的深浅拷贝
- JS数组和对象的深拷贝
- 对象和数组的深浅拷贝
- Theano和Tensorflow多GPU使用问题
- JAVA,最起码,你应该知道这些!
- 第7章_树和二叉树
- 各种异常
- Bootstrap 学习笔记(一)
- 数组的拷贝及对象clone
- 阻止自动填写 & CheckBox全选jq
- Google Guava
- Oracle函数listagg根据表中的行创建分隔列表
- 插入音频
- 商务接待礼仪常识分享
- oracle从a表导入到b表的方法
- Vue常用经典开源项目汇总参考
- tf2