java的system.arraycopy()方法

java.lang.System的静态方法arraycopy()可以实现数组的复制。

java其实没有二维数组的概念,平常实现的二维数组只是元素是一维数组的一维数组,而数组也是引用类型,继承自Object类。数组是new出来的。这些性质也就导致arraycopy()二维数组时出现的问题。如果是复制一个一位数组,那么改变复制后的数组并不影响原数组。但是如果复制一个二维数组,那么改变其中任何一个数组,那么另一个的值也发生了变化。

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



Java代码   收藏代码
  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, 010);  
  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("\nThis 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("\nThis 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("\nThis 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("\nThis 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. }  

结果: 

This is s1 
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf, 
This is s2 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
This is original s3 
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf, 
This is s3 after s4 has changed. 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
This is s4 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
Java代码   收藏代码
  1. 01.public static void arraycopy(Object src,       
  2. 02.                             int srcPos,       
  3. 03.                             Object dest,       
  4. 04.                             int destPos,       
  5. 05.                             int length)       
  6. 06.    从指定源数组中复制一个数组,复制从指定的位置开始,到目标数组的指定位置结束。从 src 引用的源数组到 dest 引用的目标数组,数组组件的一个子序列被复制下来。被复制的组件的编号等于 length 参数。源数组中位置在 srcPos 到 srcPos+length-1 之间的组件被分别复制到目标数组中的 destPos 到 destPos+length-1 位置。    


Java代码   收藏代码
  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, 010);  
  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("\nThis 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("\nThis 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("\nThis 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("\nThis 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. }  

结果: 

This is s1 
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf, 
This is s2 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
This is original s3 
中国,山西,太原,TYUT,zyy,加拿大,不知道哪个州,不知道哪个市,不知道哪个学校,yxf, 
This is s3 after s4 has changed. 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
This is s4 
中国,山西,太原,TYUT,zyy,加拿大,假设蒙大拿州,假设蒙特利尔市,假设Montreal商学院,yxf, 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
System.arraycopyJava中的一个方法,用于将一个数组的内容复制到另一个数组中。它的用法是:System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)。其中,src是源数组,srcPos是源数组的起始位置,dest是目标数组,destPos是目标数组的起始位置,length是要复制的元素个数。 System.arraycopy是一种浅拷贝方式,它只是将源数组的引用复制给目标数组,而不会复制源数组中的元素的值。因此,如果原始数组改变了,复制的数组也会发生相应的改变。 关于System.arraycopy的具体实现,可以参考引用中的源码拜读部分。另外,引用中也提到了System.arraycopy是对数组进行复制的常用方法。 在引用的代码示例中,可以看到System.arraycopy的具体用法。首先定义了一个二维数组src,然后使用System.arraycopy将src复制给了dest数组。接着,通过修改src数组的元素,可以观察到dest数组也发生了相应的改变,这正是浅拷贝的特性。 总之,System.arraycopyJava中用于数组复制的方法,它是一种浅拷贝方式,可以将源数组的内容复制到目标数组中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [System.arraycopy详解](https://blog.csdn.net/yangruidage21/article/details/128519021)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值