zoukankan      html  css  js  c++  java
  • Java对数组的复制[转]

    原文地址http://x10232.iteye.com/blog/2230762

    定义一个数组

    Java代码 复制代码 收藏代码
    1. int[] a={3,1,4,2,5};   
    2. int[] b=a;   
    int[] a={3,1,4,2,5}; 
    int[] b=a; 

      数组b只是对数组a的又一个引用,即浅拷贝。
      如果改变数组b中元素的值,其实是改变了数组a的元素的值,要实现深度复制,可以用clone或者System.arrayCopy

    Java代码 复制代码 收藏代码
    1. int[] a={3,1,4,2,5};  
    2. int[] b=a.clone();  
    3. b[0]=10;  
    4. System.out.println(b[0]+"  "+a[0]);  
    int[] a={3,1,4,2,5};
    int[] b=a.clone();
    b[0]=10;
    System.out.println(b[0]+"  "+a[0]);

    但是clone和System.arrayCopy都是对一维数组的深度复制。
    对于二维数组则不一样:

    Java代码 复制代码 收藏代码
    1. int[][] a={{3,1,4,2,5},{4,2}};  
    2. int[][] b=a.clone();  
    3. b[0][0]=10;  
    4. System.out.println(b[0][0]+"  "+a[0][0]);  
    int[][] a={{3,1,4,2,5},{4,2}};
    int[][] b=a.clone();
    b[0][0]=10;
    System.out.println(b[0][0]+"  "+a[0][0]);

    输出为10  10所以clone并不能直接作用于二维数组。
      因为java中没有二维数组的概念,只有数组的数组。所以二维数组a中存储的实际上是两个一维数组的引用。当调用clone函数时,是对这两个引用进行了复制。
      要证明,只需看下面的输出

    Java代码 复制代码 收藏代码
    1. int[][] a={{3,1,4,2,5},{4,2}};  
    2. int[][] b=a.clone();  
    3. b[0][0]=10;  
    4. System.out.println(b[0][0]+"  "+a[0][0]);  
    5. System.out.println(a[0]==b[0]);  
    int[][] a={{3,1,4,2,5},{4,2}};
    int[][] b=a.clone();
    b[0][0]=10;
    System.out.println(b[0][0]+"  "+a[0][0]);
    System.out.println(a[0]==b[0]);

    第5句输出为true.用clone对二维数组进行复制,要在每一维上调用clone函数

    Java代码 复制代码 收藏代码
    1. int[][] a={{3,1,4,2,5},{4,2}};  
    2. int[][] b=new int[a.length][];  
    3. for(int i=0;i<a.length;i++)  
    4. {   
    5. b[i]=a[i].clone();  
    6. }   
    7. b[0][0]=10;  
    8. System.out.println(b[0][0]+"  "+a[0][0]);  
    9. System.out.println(b[0]==a[0]);  
    int[][] a={{3,1,4,2,5},{4,2}};
    int[][] b=new int[a.length][];
    for(int i=0;i<a.length;i++)
    { 
    b[i]=a[i].clone();
    } 
    b[0][0]=10;
    System.out.println(b[0][0]+"  "+a[0][0]);
    System.out.println(b[0]==a[0]);

    输出为10  3 false
      小结:
      数组的复制方法现在至少有四个思路:
      1 使用循环结构 这种方法最灵活。唯一不足的地方可能就是代码较多
      2 使用Object类的clone()方法, 这种方法最简单,得到原数组的一个副本。灵活形也最差。效率最差,尤其是在数组元素很大或者复制对象数组时。

    Java代码 复制代码 收藏代码
    1. protected Object clone()   
    protected Object clone() 

      3 使用Systems的arraycopy这种方法被告之速度最快,并且灵活性也较好,可以指定原数组名称、以及元素的开始位置、复制的元素的个数,目标数组名称、目标数组的位置。

    Java代码 复制代码 收藏代码
    1. static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)   
    static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length) 

      4 Arrarys类的copyOf()方法与copyOfRange()方法可实现对数组的复制

    Java代码 复制代码 收藏代码
    1. static <T> T[] copyOf(T[] original, int newLength)  
    2. static <T> T[] copyOfRange(T[] original, int from, int to)   
    static <T> T[] copyOf(T[] original, int newLength)
    static <T> T[] copyOfRange(T[] original, int from, int to) 

    参考文献http://jingyan.baidu.com/article/e4d08ffddbb7610fd2f60d90.html

  • 相关阅读:
    Git命令之回退篇 git revert git reset
    sklearn的train_test_split
    JavaScript简介
    湖南省第八届大学生计算机程序设计竞赛D题 平方根大搜索
    C++ 11 标准 新增的Lambda表达式、for_each语法,改变了auto关键字的意义
    boost正则表达式 验证电子邮件地址
    C++ 11 标准 Lambda表达式
    JavaScript正则表达式 验证电子邮件地址
    C++11标准新增可变参数模板(variadic template)
    POSIX正则表达式 验证电子邮件地址
  • 原文地址:https://www.cnblogs.com/byron0918/p/4682739.html
Copyright © 2011-2022 走看看