zoukankan      html  css  js  c++  java
  • java 数组复制

    http://www.cnblogs.com/zhengbin/p/5671403.html

    http://www.cnblogs.com/jjdcxy/p/5870524.html

     

    Java数组拷贝的四种方法

    标签: clone拷贝方法数组copy
     

    Java数组拷贝主要有四种方法,分别是循环赋值,System.arraycopy(),Arrays.copyOf()(或者Arrays.copyOfRange)和clone()方法。下面分别介绍一下这几种拷贝。

    循环拷贝(速度相对比较慢)

    循环拷贝其实没什么好说的啦,就是用一个for循环进行元素的逐个拷贝,进行深拷贝或者浅复制这个大家可以自己把握。

    System.arraycopy(浅拷贝)

    这个是系统提供的拷贝方式,也是我们推荐使用的拷贝方式,它是浅拷贝,也就是说对于非基本类型而言,它拷贝的是对象的引用,而不是去新建一个新的对象。通过它的代码我们可以看到,这个方法不是用java语言写的,而是底层用c或者c++实现的,因而速度会比较快。

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

    通过源代码我们可以看到,关键字native说明它不是用java语言写的,而是调用其他语言的代码。

    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;
        }

    实际上它调用的就是System.arraycopy,所以肯定也是浅拷贝。

    Object.clone

    clone()比较特殊,对于对象而言,它是深拷贝,但是对于数组而言,它是浅拷贝。

    对象拷贝

    首先讲一下对象的拷贝,它是深拷贝,大家可以用对象去测试一下。下面我们看一下它的源代码:

    protected native Object clone() throws CloneNotSupportedException;

    这里也有native关键字,所以也是底层的C语言实现的。 
    还要注意的是,这里修饰符是protected,也就是说,我们创建了一个Object类以后,是不能直接调用这个clone()方法的,因为protected关键字只允许同一个包内的类和它的子类调用,所以我们声明一个object类时,肯定不是同一个包内,所以就不能去调用它。

    要调用这个方法,就需要我们写一个类,然后声明实现cloneable接口就好了,不需要去显示地声明继承于object,因为java中的类如果不显示说明父类的话,默认父类就是object。然后我们继承这个方法:

    @Override
        public Object clone() throws CloneNotSupportedException {
            // TODO Auto-generated method stub
            return super.clone();
        }

    这里需要是,为了能够在不同包内去调用这个方法,我们需要把这个权限升级为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
        }
    }
  • 相关阅读:
    apache安全—用户访问控制
    hdu 3232 Crossing Rivers 过河(数学期望)
    HDU 5418 Victor and World (可重复走的TSP问题,状压dp)
    UVA 11020 Efficient Solutions (BST,Splay树)
    UVA 11922 Permutation Transformer (Splay树)
    HYSBZ 1208 宠物收养所 (Splay树)
    HYSBZ 1503 郁闷的出纳员 (Splay树)
    HDU 5416 CRB and Tree (技巧)
    HDU 5414 CRB and String (字符串,模拟)
    HDU 5410 CRB and His Birthday (01背包,完全背包,混合)
  • 原文地址:https://www.cnblogs.com/dream-it-possible/p/7018804.html
Copyright © 2011-2022 走看看