文章目录

  • 一维数组
    • for循环
      • 拷贝数值类型
      • 拷贝引用类型
    • clone()
      • 拷贝数值方式
      • 拷贝引用类型
    • System.arraycopy()
      • 拷贝数值类型
      • 拷贝引用类型
    • Arrays.copyof()
      • 拷贝数值类型
      • 拷贝引用类型
  • 二维数组
    • for循环
      • 拷贝数值类型
      • 拷贝引用类型
    • clone()
      • 拷贝数值类型
      • 拷贝引用类型
    • System.arraycopy()
      • 拷贝数值类型
      • 拷贝引用类型
    • Arrays.copyof()
      • 拷贝数值类型
      • 拷贝引用类型
  • 源码分析
    • for
    • clone()
    • System.arraycopy()
    • Arrays.copyof()

数组的拷贝方式有四种,分别是:
for循环    clone()   System.arraycopy()    Arrays.copyof()

一维数组

for循环

拷贝数值类型

 int[] array = {1,2,3,4,5,6};int[] array2 = new int[6];for (int i = 0; i < array.length; i++) {array2[i] = array[i];}System.out.println("拷贝数值类型:");System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));System.out.println("--------------修改后--------------------");array2[0] = 0;System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));

下面是运行结果:

拷贝引用类型

public class Arraycopy {public static void main(String[] args) {TestArray[] arrays = new TestArray[4];arrays[0] = new TestArray(1);arrays[1] = new TestArray(2);arrays[2] = new TestArray(3);arrays[3] = new TestArray(4);TestArray[] arrays2 = new TestArray[4];for (int i = 0; i < arrays.length; i++) {arrays2[i] = arrays[i];}System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0].setData(0);show(arrays);show(arrays2);}public static void show(TestArray[] arrays) {for (int i = 0; i < arrays.length; i++) {System.out.print(arrays[i].getData() + " ");}System.out.println();}
}
class TestArray {private int data;public TestArray(int data) {this.data = data;}public int getData() {return data;}public void setData(int data) {this.data = data;}
}

clone()

拷贝数值方式

 int[] array = {1,2,3,4,5,6};int[] array2 = new int[6];array2 = array.clone();System.out.println("拷贝数值类型:");System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));System.out.println("--------------修改后--------------------");array2[0] = 0;System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));

拷贝引用类型

 TestArray[] arrays = new TestArray[4];arrays[0] = new TestArray(1);arrays[1] = new TestArray(2);arrays[2] = new TestArray(3);arrays[3] = new TestArray(4);TestArray[] arrays2 = new TestArray[4];arrays2 = arrays.clone();System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0].setData(0);show(arrays);show(arrays2);

System.arraycopy()

拷贝数值类型

 int[] array = {1,2,3,4,5,6};int[] array2 = new int[6];System.arraycopy(array,0,array2,0,array.length);System.out.println("拷贝数值类型:");System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));System.out.println("--------------修改后--------------------");array2[0] = 0;System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));

拷贝引用类型

 TestArray[] arrays = new TestArray[4];arrays[0] = new TestArray(1);arrays[1] = new TestArray(2);arrays[2] = new TestArray(3);arrays[3] = new TestArray(4);TestArray[] arrays2 = new TestArray[arrays.length];System.arraycopy(arrays,0,arrays2,0,arrays.length);arrays2 = arrays.clone();System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0].setData(0);show(arrays);show(arrays2);

Arrays.copyof()

拷贝数值类型

 int[] array = {1,2,3,4,5,6};int[] array2 = new int[6];array2 = Arrays.copyOf(array,array.length);System.out.println("拷贝数值类型:");System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));System.out.println("--------------修改后--------------------");array2[0] = 0;System.out.println(Arrays.toString(array));System.out.println(Arrays.toString(array2));

拷贝引用类型

 TestArray[] arrays = new TestArray[4];arrays[0] = new TestArray(1);arrays[1] = new TestArray(2);arrays[2] = new TestArray(3);arrays[3] = new TestArray(4);TestArray[] arrays2 = new TestArray[4];arrays2 = Arrays.copyOf(arrays,arrays.length);System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0].setData(0);show(arrays);show(arrays2);

二维数组

for循环

拷贝数值类型

 int[][] array = {{1,2,3},{4,5,6}};int[][] array2 = new int[2][3];for (int i = 0; i < array.length; i++) {for (int j = 0; j < array[i].length; j++) {array2[i][j] = array[i][j];}}System.out.println("拷贝数值类型:");System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));System.out.println("--------------修改后--------------------");array2[0][0] = 0;System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));

拷贝引用类型

public class TwoArrayCopy {public static void main(String[] args) {TestArray[][] arrays = new TestArray[2][2];arrays[0][0] = new TestArray(1);arrays[0][1] = new TestArray(2);arrays[1][0] = new TestArray(3);arrays[1][1] = new TestArray(4);TestArray[][] arrays2 = new TestArray[2][2];for (int i = 0; i < arrays.length; i++) {for (int j = 0; j < arrays[i].length; j++) {arrays2[i][j] = arrays[i][j];}}System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0][0].setData(0);show(arrays);show(arrays2);}public static void show(TestArray[][] arrays) {for (int i = 0; i < arrays.length; i++) {for (int j = 0; j < arrays[i].length; j++) {System.out.print(arrays[i][j].getData() + " ");}System.out.println();}}
}
class TestArray {private int data;public TestArray(int data) {this.data = data;}public int getData() {return data;}public void setData(int data) {this.data = data;}
}

clone()

拷贝数值类型

 int[][] array = {{1,2,3},{4,5,6}};int[][] array2 = new int[2][3];for (int i = 0; i < array.length; i++) {array2[i] = array[i].clone();}System.out.println("拷贝数值类型:");System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));System.out.println("--------------修改后--------------------");array2[0][0] = 0;System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));

拷贝引用类型

 TestArray[][] arrays = new TestArray[2][2];arrays[0][0] = new TestArray(1);arrays[0][1] = new TestArray(2);arrays[1][0] = new TestArray(3);arrays[1][1] = new TestArray(4);TestArray[][] arrays2 = new TestArray[2][2];for (int i = 0; i < arrays.length; i++) {arrays2[i] = arrays[i].clone();}System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0][0].setData(0);show(arrays);show(arrays2);

System.arraycopy()

拷贝数值类型

 int[][] array = {{1,2,3},{4,5,6}};int[][] array2 = new int[2][3];for (int i = 0; i < array.length; i++) {System.arraycopy(array[i],0,array2[i],0,array[i].length);}System.out.println("拷贝数值类型:");System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));System.out.println("--------------修改后--------------------");array2[0][0] = 0;System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));

拷贝引用类型

 TestArray[][] arrays = new TestArray[2][2];arrays[0][0] = new TestArray(1);arrays[0][1] = new TestArray(2);arrays[1][0] = new TestArray(3);arrays[1][1] = new TestArray(4);TestArray[][] arrays2 = new TestArray[2][2];for (int i = 0; i < arrays.length; i++) {System.arraycopy(arrays[i],0,arrays2[i],0,arrays[i].length);}System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0][0].setData(0);show(arrays);show(arrays2);

Arrays.copyof()

拷贝数值类型

 int[][] array = {{1,2,3},{4,5,6}};int[][] array2 = new int[2][3];for (int i = 0; i < array.length; i++) {array2[i] = Arrays.copyOf(array[i],array[i].length);}System.out.println("拷贝数值类型:");System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));System.out.println("--------------修改后--------------------");array2[0][0] = 0;System.out.println(Arrays.deepToString(array));System.out.println(Arrays.deepToString(array2));

拷贝引用类型

 TestArray[][] arrays = new TestArray[2][2];arrays[0][0] = new TestArray(1);arrays[0][1] = new TestArray(2);arrays[1][0] = new TestArray(3);arrays[1][1] = new TestArray(4);TestArray[][] arrays2 = new TestArray[2][2];for (int i = 0; i < arrays.length; i++) {arrays2[i] = Arrays.copyOf(arrays[i],arrays[i].length);}System.out.println("拷贝引用类型:");show(arrays);show(arrays2);System.out.println("--------------修改后--------------------");arrays2[0][0].setData(0);show(arrays);show(arrays2);

源码分析

for

for循环是一种很灵巧的数组拷贝方式,经常可以自己封装成方法去使用。

clone()

克隆方法我们在数组中是找不到的,它是object的方法,我们先看看源码

    protected native Object clone() throws CloneNotSupportedException;

看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。

System.arraycopy()

通过System类调用的静态方法,我们先看看源码

public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

先来解释一下这些形参代表的意思,src代表被拷贝的对象,srcPos代表起始位置,dest代表目标对象,destpost代表目标对象的起始位置,length代表拷贝的长度。我们看到也是native修饰的,所以底层也是用c或者c++实现的,但是可以看到没有返回值,clone()还需要对返回值进行类型转换,所以它的速度是要比clone()要快的,这也是牛客网的一道题,问的就是四种拷贝哪种是最快的,答案肯定是System.arraycopy()。

Arrays.copyof()

这个方法是属于Arrays类的,我们先来看看源码是怎样实现的,在源码中提供了很多方法的重载,无非就是对于类型的一些替换,比如int数组,byte数组等等,就不一一列举了,我们写出常用的一个方法

    public static int[] copyOf(int[] original, int newLength) {int[] copy = new int[newLength];System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));      return copy;}

我们可以看到,在方法内部调用了System.arraycopy(),只是相当于重写了一下,换了一个名字。解释一下形参,original是待拷贝对象,newLength表示拷贝的长度,当然还有Arrays.copyOfRange(),就是可以控制拷贝的范围,不过我认为可以常用System.arraycopy(),这样什么情况都可以解决。

java数组的四种拷贝方式相关推荐

  1. C语言二维数组的四种遍历方式

    二维数组的四种遍历方式: a[i][j]   *(a[i]+j)   *(*(a+i)+j)    *(&a[0][0]+i*n+j)  1.a[i][j] :  这种方法是最基本的方式. 2 ...

  2. Java 内部类的四种实现方式

    Java 内部类的四种实现方式 前言 今天的话我将为大家介绍Java的四种内部类,他们分别是普通内部类,静态内部类,局部内部类,匿名内部类. 提示:以下是本篇文章正文内容,下面案例可供参考 一.内部类 ...

  3. (C++)字符数组的四种输入输出方式

    scanf/printf+%s getchar()/putchar() 前者不带参数后者带 gets()/puts() 二者都带参数,为一维字符数组或二维字符数组的一维 运用指针+scanf/prin ...

  4. JAVA数组的3种赋值方式

    基本数据类型数组的3种赋值方式 第一种赋值方式 int[] arr = {1,2,3}; 第二种赋值方式 int[] arr2 = new int[]{1,2,3}; 第三种赋值方式 int[] ar ...

  5. Java:简述Java多线程的四种实现方式

    关联文章:<Java:简述Java中的多线程编程> Java多线程实现方式主要有四种:继承Thread类.实现Runnable接口.实现Callable接口通过FutureTask包装器来 ...

  6. Java对象的四种引用方式

    本文会按照以下思路进行: (1)Java的四种对象引用的基本概念 (2)四种对象引用的差异对比 (3)对象可及性的判断以及与垃圾回收机制的关系 (4)引用队列ReferenceQueue的介绍 (5) ...

  7. 数组的四种初始化方式

    第一种: 对数组的每一个成员都进行初始化 demo1: int age[8] = {23,23,21,45,3,23,34,12}; age[0] = {23}; age[1] = {23}; age ...

  8. Java中的四种引用方式的区别

    强引用.软引用.弱引用.虚引用的概念 ps:我更新了.....我真的更新了.....因为博客园不支持MarkDown,而且取了一个很low的用户名,所以不用了..... 强引用(StrongRefer ...

  9. 面试官:说说Java对象的四种引用方式

    我们知道在Java中除了基础的数据类型以外,其它的都为引用类型. 而Java根据其生命周期的长短将引用类型又分为强引用.软引用.弱引用.幻象引用 . 正常情况下我们平时基本上我们只用到强引用类型,而其 ...

  10. java—数组的3种声明方式

    1.数组元素类型[] 数组名 = new 数组元素类型[数组元素个数]; 例如:int类型 int[] arr= new int[5]; //赋值 arr[0]=1; arr[1]=2; //...以 ...

最新文章

  1. 基于c语言优先级病房呼叫_C语言
  2. 彻底理解js中this的指向
  3. 水痘痊愈就能终生免疫?其实病毒仍潜伏在神经,随时以更可怕的形式爆发......
  4. is this mysql server_Mysql:is not allowed to connect to this MySQL server
  5. shutil的一些基本用法
  6. win7笔记本为手机共享wifi
  7. 与自定义词典 分词_使用jieba库进行中文分词、关键词提取、添加自定义的词典进行分词...
  8. node学习笔记,第一个Node程序
  9. Python:Python全球生态主站,pip安装方法、集成安装方法、文件安装方法、第三方库自动安装脚本
  10. 我们做出了一个艰难的决定
  11. 开发健康状态监控接口
  12. ThinkPHP实现注册功能
  13. 华为数据之道(5):华为数字化转型的目标、蓝图和愿景
  14. 微信html代码怎么换行,微信公众号代码区域换行问题(解决)
  15. matlab 短时傅立叶变换,Matlab中短时傅里叶变换 spectrogram和stft的用法
  16. Electron常见问题 30 - 深度填坑之阴影问题
  17. 开源四轴飞行器CC3D的稳定模式和PID算法简介
  18. Linux基础知识命令总结1
  19. 星巴克招人!要技术大拿。
  20. 荣耀全家桶框架插件(关联P30pro、Mate20、荣耀20pro等)

热门文章

  1. 通过UA判断手机的类型
  2. 熊猫TV技术与直播技术相关
  3. 如何将离线DAT卫星影像解压为瓦片?
  4. 青春(2010-05-28 04:30:39)韩寒
  5. 智慧社区安防核心硬件:无障碍人脸识别终端
  6. 最新windows7旗舰版密钥
  7. WIN10计算机不支持3D游戏怎么办,win10电脑3d设置在哪里设置
  8. 仿QQ聊天界面里边的相册(QQ相册)
  9. 再迎顶尖科学家,百度研究院为何如此吸引大师级AI人才?
  10. 标准盒子模型和IE盒子模型