Java拷贝数组
来源:互联网 发布:东宫番外之清风知我意 编辑:程序博客网 时间:2024/06/05 08:35
转自:http://blog.csdn.net/abyjun/article/details/46444921
Java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下面分别介绍一下这几种拷贝。
循环拷贝(速度相对比较慢)
循环拷贝其实没什么好说的啦,就是用一个for循环进行元素的逐个拷贝,进行深拷贝或者浅复制这个大家可以自己把握。
System.arraycopy(浅拷贝)
这个是系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是去新建一个新的对象。通过它的代码我们可以看到,这个方法不是用java语言写的,而是底层用c或者c++实现的,因而速度会比较快。
- 1
- 1
通过源代码我们可以看到,关键字native说明它不是用java语言写的,而是调用其他语言的代码。
Arrays.copyOf(浅拷贝)
这个方法也是浅拷贝,为什么呢?我们看一下它的源代码就知道了。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
实际上它调用的就是System.arraycopy,所以肯定也是浅拷贝。
Object.clone
clone()比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝。
对象拷贝
首先讲一下对象的拷贝,它是深拷贝,大家可以用对象去测试一下。下面我们看一下它的源代码:
- 1
- 1
这里也有native关键字,所以也是底层的c语言实现的。
还要注意的是,这里修饰符是protected,也就是说,我们创建了一个Object类以后,是不能直接调用这个clone()方法的,因为protected关键字只允许同一个包内的类和它的子类调用,所以我们声明一个object类时,肯定不是同一个包内,所以就不能去调用它。
要调用这个方法,就需要我们写一个类,然后声明实现cloneable接口就好了,不需要去显示地声明继承于object,因为java中的类如果不显示说明父类的话,默认父类就是object。然后我们继承这个方法:
- 1
- 2
- 3
- 4
- 5
- 1
- 2
- 3
- 4
- 5
这里需要是,为了能够在不同包内去调用这个方法,我们需要把这个权限升级为public。现在我们就可以调用这个类的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 }}
- java拷贝数组(深拷贝)
- Java 数组 的 拷贝
- java中数组拷贝
- java中拷贝数组
- Java 数组的拷贝
- java中的数组拷贝
- JAVA二维数组拷贝
- Java 数组的拷贝
- Java数组拷贝
- JAVA 数组拷贝
- Java数组拷贝
- Java拷贝数组
- Java 数组拷贝
- Java核心技术--数组拷贝
- JAVA数组的拷贝
- JAVA之数组拷贝
- Java 数组 浅拷贝与深拷贝
- Java 数组 浅拷贝与深拷贝
- hadoop集群的一些测试
- uploadify多图片上传(html5版本)
- Unix/Linux编程实践教程–cat在OS X的实现
- xmpp学习资料及xmpp协议抓包方法
- 剑指offer 面试题60 把二叉树打印成多行
- Java拷贝数组
- [YTU]_2478( C++习题 虚函数-计算图形面积)
- PHP中header用法小结
- Android新特性介绍,ConstraintLayout完全解析
- ajax在什么情况下走success和error
- 重写ajax方法实现请求session过期时跳转登录页面
- JSP —— three
- [bigdata-095] IoC 控制反转 的本质
- Vue.js vs React vs Angular 深度对比