码迷,mamicode.com
首页 > 编程语言 > 详细

Java System.arraycopy

时间:2017-09-21 15:54:54      阅读:158      评论:0      收藏:0      [点我收藏+]

标签:copy   基础   16px   理解   double   资料   测试   自我   --   

System.arraycopy方法:如果是数组比较大,那么使用System.arraycopy会比较有优势,因为其使用的是内存复制,省去了大量的数组寻址访问等时间

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

  复制指定源数组src到目标数组dest。复制从src的srcPos索引开始,复制的个数是length,复制到dest的索引从destPos开始。

1.举例

    @Test
    public void testCopy() {
        int[] ids = {1, 2, 3, 4, 5};

        // 1、测试复制到别的数组上
        // 将ids数组的索引从0开始其后5个数,复制到ids2数组的索引从0开始
        int[] ids2 = new int[5];
        System.arraycopy(ids, 0, ids2, 0, 5);
        System.out.println(Arrays.toString(ids2)); // [1, 2, 3, 4, 5]


        // 2、测试自我复制
        System.arraycopy(ids, 0, ids, 3, 2);
        System.out.println(Arrays.toString(ids)); // [1, 2, 3, 1, 2]


        // 3、如果是类型转换问题
        Object[] o1 = {1, 2, 3, 4.5, 6.7};
        Integer[] o2 = new Integer[5];
        try {
            System.arraycopy(o1, 0, o2, 0, o1.length);
        } catch (ArrayStoreException ex) {
            // 发生存储转换,部分成功的数据会被复制过去
            System.out.println("拷贝发生异常:数据转换错误,无法存储。");
        }
        // 从结果看,前面3个可以复制的数据已经被存储了。剩下的则没有
        System.out.println(Arrays.toString(o2)); // [1, 2, 3, null, null]
    }

  

2、复制后改变复制后的数组

如果是复制一个一维数组,那么改变复制后的数组并不影响原数组。但是如果复制一个二维数组,那么改变其中任何一个数组,那么另一个的值也发生了变化。开始不是很明白,后来上网查了查资料,理解了其中奥妙。

java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组,而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。

如果是一维数组,那么元素都是基础类型(如int,double等),使用arraycopy()方法后,是把原数组的值传给了新数组,属于值传递。而如果是二维数组,数组的第一维装的是一个一维数组的引用,第二维里是元素数值。对二维数组应用arraycopy()方法后,第一维的引用被复制给新数组的第一维,也就是两个数组的第一维都指向相同的“那些数组”。而这时改变其中任何一个数组的元素的值,其实都修改了“那些数组”的元素的值,所以原数组和新数组的元素值都一样了。

    @Test
    public void testCopy2(){
        int[] s1 = {1, 2, 3, 4, 5};
        int[] s2 = new int[5];
        System.arraycopy(s1, 0, s2, 0, 5);

        System.out.println("This is s1");
        for(int aS1 : s1) {
            System.out.print(aS1 + " , ");
        }

        s2[2] = 111;
        System.out.println("\nThis is s2");
        for(int aS2 : s2) {
            System.out.print(aS2 + " , ");
        }
        System.out.println("\nThis is s1");
        for(int aS1 : s1) {
            System.out.print(aS1 + " , ");
        }

        System.out.println("\n-----------------------");
        //二维数组
        int[][] s3 = {{1, 2, 3, 4, 5}, {6, 7, 8, 9, 10}};
        int[][] s4 = new int[s3.length][s3[0].length];
        System.out.println("This is s3");
        System.arraycopy(s3, 0, s4, 0, s3.length);
        for (int[] aS3 : s3) {
            for (int j = 0; j < s4[0].length; j++) {
                System.out.print(aS3[j] + ",");
            }
        }

        s4[1][3] = 111;
        System.out.println("\nThis is s4");
        for (int[] aS4 : s4) {
            for (int j = 0; j < s4[0].length; j++) {
                System.out.print(aS4[j] + ",");
            }
        }
        System.out.println("\nThis is s3");
        for (int[] aS3 : s3) {
            for (int j = 0; j < s4[0].length; j++) {
                System.out.print(aS3[j] + ",");
            }
        }
    }

  结果: This is s1 :1 , 2 , 3 , 4 , 5 , 
                  This is s2 : 1 , 2 , 111 , 4 , 5 , 
                  This is s1 : 1 , 2 , 3 , 4 , 5 , 
-----------------------
                  This is s3 : 1,2,3,4,5,6,7,8,9,10,
                  This is s4 : 1,2,3,4,5,6,7,8,111,10,

                  This is s3 : 1,2,3,4,5,6,7,8,111,10,

Java System.arraycopy

标签:copy   基础   16px   理解   double   资料   测试   自我   --   

原文地址:http://www.cnblogs.com/jesssey/p/7568667.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!