zoukankan      html  css  js  c++  java
  • Java学习之System.arraycopy()方法

          java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少。System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制。其函数原型是:

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

    src:源数组; srcPos:源数组要复制的起始位置; dest:目的数组; destPos:目的数组放置的起始位置; length:复制的长度。 注意:src and dest都必须是同类型或者可以进行转换类型的数组. 有趣的是这个函数可以实现自己到自己复制,比如: int[] fun ={0,1,2,3,4,5,6};            System.arraycopy(fun,0,fun,3,3); 则结果为:{0,1,2,0,1,2,6}; 实现过程是这样的,先生成一个长度为length的临时数组,将fun数组中srcPos 到srcPos+length-1之间的数据拷贝到临时数组中,再执行System.arraycopy(临时数组,0,fun,3,3).于是我试了试,发现以下问题。 如果是复制一个一位数组,那么改变复制后的数组并不影响原数组。但是如果复制一个二维数组,那么改变其中任何一个数组,那么另一个的值也发生了变化。开始不是很明白,后来上网查了查资料,理解了其中奥妙。 java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组,而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。

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

     1 public class TestArrayCopy {
     2 
     3 /**
     4 * @param args
     5 */
     6 public static void main(String[] args) {
     7    // TODO 自动生成方法存根
     8   
     9    String[] s1 = {"中国","山西","太原","TYUT","zyy","加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"};
    10    String[] s2 = new String[10];
    11    System.arraycopy(s1, 0, s2, 0, 10);
    12    s2[6] = "假设蒙大拿州";
    13    s2[7] = "假设蒙特利尔市";
    14    s2[8] = "假设Montreal商学院";
    15   
    16    System.out.println("This is s1");
    17    for(int i = 0;i < s1.length ;i++){
    18     System.out.print(s1[i] + ",");
    19    }
    20   
    21    System.out.println("
    This is s2");
    22    for(int i = 0;i < s2.length ;i++){
    23     System.out.print(s2[i] + ",");
    24    }
    25   
    26    String[][] s3 = {{"中国","山西","太原","TYUT","zyy"},{"加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"}};
    27    String[][] s4 = new String[s3.length][s3[0].length];
    28    System.arraycopy(s3, 0, s4, 0, s3.length);
    29   
    30    System.out.println("
    This is original s3");
    31    for(int i = 0;i < s3.length ;i++){
    32     for(int j = 0; j< s3[0].length ;j++){
    33      System.out.print(s3[i][j] + ",");
    34     }
    35    }
    36   
    37    s4[1][1] = "假设蒙大拿州";
    38    s4[1][2] = "假设蒙特利尔市";
    39    s4[1][3] = "假设Montreal商学院";
    40   
    41    System.out.println("
    This is s3 after s4 has changed.");
    42    for(int i = 0;i < s3.length ;i++){
    43     for(int j = 0; j< s3[0].length ;j++){
    44      System.out.print(s3[i][j] + ",");
    45     }
    46    }
    47   
    48    System.out.println("
    This is s4");
    49    for(int i = 0;i < s4.length ;i++){
    50     for(int j = 0; j < s4[0].length ; j++){
    51      System.out.print(s4[i][j] + ",");
    52     }
    53       
    54    }
    55 }
    56 
    57 }
  • 相关阅读:
    表单提交textarea内容,第一次获取不到值,第二次才能获取到的解决方法:
    连接oracle数据库报错:TNS-12516 TNS:listener could not find available handler with matching protocol stack解决方法
    【BZOJ 1272】 1272: [BeiJingWc2008]Gate Of Babylon (容斥原理+卢卡斯定理)
    【BZOJ 3456】 3456: 城市规划 (NTT+多项式求逆)
    【BZOJ 4332】 4332: JSOI2012 分零食 (FFT+快速幂)
    【BZOJ 4555】 4555: [Tjoi2016&Heoi2016]求和 (NTT)
    【BZOJ 4503】4503: 两个串 (FFT)
    【BZOJ 3771】 3771: Triple (FFT+容斥)
    【BZOJ 3160】 3160: 万径人踪灭 (FFT)
    【UOJ 34】 #34. 多项式乘法 (FFT)
  • 原文地址:https://www.cnblogs.com/sunfie/p/5222526.html
Copyright © 2011-2022 走看看