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 classTestArrayCopy {2

3 /**

4 *@paramargs5 */

6 public static voidmain(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("\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 }

java arraycopy()方法_Java学习之System.arraycopy()方法相关推荐

  1. java arraycopy 参数_java 数组复制:System.arrayCopy 深入解析

    先看ArrayList源码中数组复制的代码: 其实ArrayList 就是一个数组的形式存放数据的.没有高深的地方. 他的性能在于他的索引能力,正因为他是数组形式,所以索引元素的时候他表现得非常的快速 ...

  2. java 反射 field get方法_JAVA学习之反射getDeclaredField()方法与getField()方法的区别

    在使用反射的时候,常用到的几个方法老是傻傻的分不清楚是干吗的,功能差不多的啊, 比如: Class.getFields(), Class.getField(String), Class.getDecl ...

  3. java 释放一个对象_JAVA中销毁一个对象的方法

    方法一:垃圾回收器 垃圾回收器是Java平台中用的最频繁的一种对象销毁方法.垃圾回收器会全程侦测Java应用程序的运行情况.当反先有些对象成为垃圾时,垃圾回收器就会销毁这些对象,并释放这些对象所占用的 ...

  4. java 系统 类_JAVA系统类 System的简单整理

    对系统属性看着JDKapi做了简单的记录,尤其是文件分隔符,以及获取系统时间,数组拷贝实用比较多谢,随意正对这几个做下简单整理,需要引入junit单元测试的jar包 //获取所有系统属性 @Test ...

  5. android xml java混合编程_Java学习中注解与多线程,网络编程与XML技术

    本部分内容主要有集合框架及泛型,实用类,输入和输出处理,注解与多线程,网络编程与XML技术.初次学习这部分会感觉很难,主要是概念难于理解,最好是多看看例子,多练习.下面是个人的总结 拉勾IT课小编为大 ...

  6. java狗叫_java学习(8) | 学步园

    本讲内容:成员变量.方法.方法的重载.构造函数 一.用程序讲解小白的故事 小白是一条狗,它心情好的时候会恭喜人发财,它心情差的时候会对路人撒野,吓得路人落荒而逃.下面我们用面向对象的方式用程序讲述一下 ...

  7. java 调用父级方法_java子类调用父类的方法是什么

    java子类调用父类的方法:1.子类的对象调用方法时,会首先在子类中查找,如果子类中没有该方法,再到父类中查找:2.如果该方法中又调用了其他方法,那么还是按照之前的顺序,先在子类中查找,再在父类中查找 ...

  8. 第一个java程序释义_Java 学习之路(1)第一个Java程序

    Hello World程序 在编程语言的世界里,第一个编程语言估计就是输出Hello World了吧. /** * 编写第一个Java程序,输出Hello World! * @author LJS * ...

  9. java clone方法_java安全编码指南之:方法编写指南

    简介 java程序的逻辑是由一个个的方法组成的,而在编写方法的过程中,我们也需要遵守一定的安全规则,比如方法的参数进行校验,不要在assert中添加业务逻辑,不要使用废弃或者过期的方法,做安全检查的方 ...

最新文章

  1. 【举栗子】Docker 容器磁盘占满的几种情况 | CSDN博文精选
  2. MainFrame小结(20110812)--MOVE ALL与INITIALIZE(cobol)
  3. 粒子群优化算法(2)离散粒子群算法
  4. java juc 包_JUC java并发包
  5. excel进销存管理系统_美萍商业进销存软件—库存了如指掌
  6. 【开学福利】13本python+AI书籍,快拿去
  7. 论文阅读笔记 Word Embeddings A Survey
  8. 六石编程学:由库调用没测试到,谈工作粗糙
  9. Eclipse安装SVN插件和svn连接器
  10. UE5学习笔记(十一)——蓝图基础之键盘和鼠标操作移动
  11. 弹性地基梁板的计算理论_第八章 弹性地基梁的计算理论
  12. 常用的数字正则表达式
  13. Word怎么压缩变小?压缩word文档不妨试试这个方法
  14. 植发搞笑图片_搞笑:终于找到原图了!像不像?
  15. Beaglebone Black - 准备
  16. python使用百度aip文字识别
  17. 如何将已有图片做成透明水印_如何批量给图片添加属于自己的全屏透明水印?其实方法很简单...
  18. AD账号导入--dsadd user
  19. 你的公司怎么样激励员工?
  20. 【PyTorch深度学习项目实战100例目录】项目详解 + 数据集 + 完整源码

热门文章

  1. oracle中的all_objects,oracle查看所有表all_objects和all_tables的区别
  2. 大连考研英语百家外语考研英语复习时间如何规划?
  3. 不知道为什么。郁闷中....
  4. 【PAT】PAT总结《语法篇》
  5. Python基础考试题目
  6. Python简单购买苹果案例
  7. html ie动画效果,HTML5 canvas实现的IE9图标旋转效果(大风车动画)
  8. 八股面经总结-C++
  9. 2018java面试题100道
  10. GameFi爆火,【农民世界】崛起,浅谈链游辅助脚本开发思路