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()方法后,第一维的引用被复制给新数组的第一维,也就是两个数组的第一维都指向相同的“那些数组”。而这时改变其中任何一个数组的元素的值,其实都修改了“那些数组”的元素的值,所以原数组和新数组的元素值都一样了。
public class TestArrayCopy {
/**
* @param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
String[] s1 = {"中国","山西","太原","TYUT","zyy","加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"};
String[] s2 = new String[10];
System.arraycopy(s1, 0, s2, 0, 10);
s2[6] = "假设蒙大拿州";
s2[7] = "假设蒙特利尔市";
s2[8] = "假设Montreal商学院";
System.out.println("This is s1");
for(int i = 0;i < s1.length ;i++){
System.out.print(s1[i] + ",");
}
System.out.println("\nThis is s2");
for(int i = 0;i < s2.length ;i++){
System.out.print(s2[i] + ",");
}
String[][] s3 = {{"中国","山西","太原","TYUT","zyy"},{"加拿大","不知道哪个州","不知道哪个市","不知道哪个学校","yxf"}};
String[][] s4 = new String[s3.length][s3[0].length];
System.arraycopy(s3, 0, s4, 0, s3.length);
System.out.println("\nThis is original s3");
for(int i = 0;i < s3.length ;i++){
for(int j = 0; j< s3[0].length ;j++){
System.out.print(s3[i][j] + ",");
}
}
s4[1][1] = "假设蒙大拿州";
s4[1][2] = "假设蒙特利尔市";
s4[1][3] = "假设Montreal商学院";
System.out.println("\nThis is s3 after s4 has changed.");
for(int i = 0;i < s3.length ;i++){
for(int j = 0; j< s3[0].length ;j++){
System.out.print(s3[i][j] + ",");
}
}
System.out.println("\nThis is s4");
for(int i = 0;i < s4.length ;i++){
for(int j = 0; j < s4[0].length ; j++){
System.out.print(s4[i][j] + ",");
}
}
}
}
Java学习之System.arraycopy()方法的更多相关文章
- Java学习-026-类名或方法名应用之二 -- 统计分析基础
前文讲述了类名或方法的应用之一调试源码,具体请参阅:Java学习-025-类名或方法名应用之一 -- 调试源码 此文主要讲述类名或方法应用之二统计分析,通过在各个方法中插桩(调用桩方法),获取方法的调 ...
- Java学习-025-类名或方法名应用之一 -- 调试源码
上文讲述了如何获取类名和方法名,敬请参阅: Java学习-024-获取当前类名或方法名二三文 . 通常在应用开发中,调试或查看是哪个文件中的方法调用了当前文件的此方法,因而在实际的应用中需要获取相应的 ...
- 【Java基础】System.arraycopy()的使用详解
由于在Java中System.arraycopy()方法在一维数组和二维数组中的表现不同,所以做了一个测试 public static void main(String[] args) { int[] ...
- System.arraycopy方法
数组的复制有多种方法,其中有一种就是System.arraycopy方法,传闻速度也很快. 方法完整签名: public static void arraycopy(Object src, int s ...
- Java基础 之 System.getProperty()方法
Java基础 之 System.getProperty()方法大全 public static void main(String[] args) { System.out.println(" ...
- java学习笔记5--类的方法
接着前面的学习: java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记1--开发环境平台总结 本文地址 ...
- System.arraycopy方法解释
数组拷贝 public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int lengt ...
- java数组之system.arrayCopy
public class ArrayDemo { /* public static void main(String[] args) { int[] a=new int[4]; int[] b=new ...
- Java学习之==>常用字符串方法
1.定义字符串 // 定义, 为初始化 String str1; // 定义, 并初始化为null String str2 = null; // 定义, 并初始化为空串 String str3 = & ...
随机推荐
- Hadoop安装(2)安装hadoop 前的centos 设置
将虚拟机网络连接设为:Bridged 添加用户:hadoop,设置密码.关闭防火墙,selinux.暂且不关闭不需要的任务. 参照:http://www.cnblogs.com/xia520pi/ar ...
- 2014.12.13 ASP.NET文件上传
一.文件上传:(一)上传到硬盘文件夹1.最简单的上传. [HTML代码] <asp:FileUpload ID="FileUpload1" runat="serve ...
- c# 自定义位数生成激活码
Random random = new Random(~unchecked((int)DateTime.Now.Ticks));private string CreateAndCheckCode(Ra ...
- iOS开发之设置界面的抽取
几乎每款app都会有一个设置的界面!!! 那么我们的设置界面到底要怎么写才能最方便使用呢?下面我就来说说我的想法. 1.观察原型图 2.找出相同的东西,目的是抽出一个基类模块,只要我写好了这个控制器, ...
- hdu 4707 Pet hdu 2013 Asia Regional Online —— Warmup
一道简单的搜索题目,建一个树,根节点是 0 ,连接的两个节点的距离是 1 ,求 到 根节点长度是2的节点的个数. #include<stdio.h> #include<string. ...
- 使用cvReleaseImage()释放图像出错
前几天用opencv写程序的时候,在用cvReleaseImage()函数释放cvLoadImage()加载的图像的时候出错,如下所示: IplImage *src = cvLoadImage(fil ...
- android:versionCode和android:versionName
Android的版本可以在androidmainfest.xml中定义,主要有android:versionCode和android:versionName android:versionCode:主 ...
- css reset 以及哪些元素有默认margin padding值
很多网站在css reset 的时候有如下做法: body, ul, ol, li, p, h1, h2, h3, h4, h5, h6, form, label, dl, dt, dd,fields ...
- View的滑动冲突
一.常见的滑动冲突 场景1:外部滑动和内部滑动不一致 场景2:外部滑动和内部滑动一致 场景3:上面两种情况的嵌套 二.滑动冲突的处理方法 场景一:根据水平滑动还是竖直滑动判断到底由谁来拦截事件. 场景 ...
- Android07-Android广播
¨广播机制简介 ¨动态和静态注册广播 ¨接收系统广播 ¨自定义广播 ¨本地广播 n广播是一种系统级的事件(Event). n当系统发生某些事件时(例如,收到短信.来电.电量低),就会向整个Andr ...