关于System.arraycopy方法的使用

关于System.arraycopy方法的使用随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。arraycopy()方法的签名如下:publicstaticvoi…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

随时随地阅读更多技术实战干货,获取项目源码、学习资料,请关注源代码社区公众号(ydmsq666)

关于System.arraycopy方法的使用

   

在对数组进复制时,我们可以编写一个for循环实现,但是比较麻烦,我们可以使用System类的静态方法arraycopy()。

arraycopy()方法的签名如下:

public static void arraycopy(Object source,int sourcePos,Object destination,int destinationPos,int length)

该方法实现从源数组的指定位置开始复制指定长度的元素到目标数组的指定位置中,第一个参数就是源数组,第二个参数是要复制的源数组中的起始位置,第三个参数是目标数组,第四个参数是要复制到的目标数组的起始位置,第五个参数是要复制的元素的长度。

下面这些代码用来测试使用arraycopy方法

import java.util.Arrays;

public class TestSystemArraycopy {

public static void main(String[] args) {

// 此方位为native方法。

// public static native void arraycopy(

// Object src, int srcPos, Object dest, // int destPos, int length);

//初始化

int[] ids = { 1, 2, 3, 4, 5 }; System.out.println(Arrays.toString(ids)); // [1, 2, 3, 4, 5]

//测试自我复制

//把从索引0开始的2个数字复制到索引为3的位置上

System.arraycopy(ids, 0, ids, 3, 2); System.out.println(Arrays.toString(ids)); // [1, 2, 3, 1, 2]

//测试复制到别的数组上

//将数据的索引1开始的3个数据复制到目标的索引为0的位置上

int[] ids2 = new int[6];

System.arraycopy(ids, 1, ids2, 0, 3); System.out.println(Arrays.toString(ids2)); // [2, 3, 1, 0, 0, 0]

//此功能要求

//源的起始位置+长度不能超过末尾

//目标起始位置+长度不能超过末尾

//且所有的参数不能为负数

try {

System.arraycopy(ids, 0, ids2, 0, ids.length + 1);

} catch (IndexOutOfBoundsException ex) {

// 发生越界异常,数据不会改变System.out.println(“拷贝发生异常:数据越界。”);

}

System.out.println(Arrays.toString(ids2)); // [2, 3, 1, 0, 0, 0]

//如果是类型转换问题

Object[] o1 = { 1, 2, 3, 4.5, 6.7 };

Integer[] o2 = new Integer[5];

System.out.println(Arrays.toString(o2)); // [null, null, null, null, null]

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]

}

}

一维数组和二维数组使用arraycopy方法的一点区别:

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

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] + “,”);
}

}
}

}

结果:

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,

可见,在一维数组中,改变目标数组不会对源数组产生任何影响,但是在二维数组中,改变复制后的目标数组会对源数组产生影响。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/213433.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • string对象下标越界

    string对象下标越界#include<iostream>#include<string>usingnamespacestd;intmain(){stringa;cin>>a[0];cin>>a[1];return0;}最近写代码时发生了这一问题,就是上边的程序,运行后会出现数组越界。其实这是一个非常小的问题,原因是我自己把string当成了一个无穷大的数组,string可以无穷大,但是这并不能将他当成无穷大数组.

    2022年9月26日
    6
  • django-filter_过滤器分几种

    django-filter_过滤器分几种模版常用过滤器在模版中,有时候需要对一些数据进行处理以后才能使用。一般在Python中我们是通过函数的形式来完成的。而在模版中,则是通过过滤器来实现的。过滤器使用的是|来使用。add将传进来的参

    2022年7月29日
    8
  • 慧荣SM2246XT主控的固态硬盘修复开卡不识别怎么短接方法

    慧荣SM2246XT主控的固态硬盘修复开卡不识别怎么短接方法一块坏了的240G的固态硬盘,电脑完全不认盘了,所以想修复一下,拆开看到主控是慧荣的SM2246XT,幸好此主控是有开卡软件的,下载也比较方便,最新的SM2246XT_MP_EnhancePageMode_MPQ1102A_DBQ0412_FWR1212A.rar修复成功率很高,但跟U盘量产不同,固态硬盘开卡是需要短接的,但很多人不知道SM2246XT的固态硬盘该怎么短接,这里就教大家。如图拆开ssd外壳后可以看到板子上有ROMMODE的字样,那里就是短接的位置了,这里的4个短接点,我们是需要用镊子两两短

    2022年6月14日
    190
  • scope=prototype有什么作用_prototype设计模式

    scope=prototype有什么作用_prototype设计模式@Scope(“prototype”)//多例模式

    2022年8月19日
    10
  • 以太网RJ45 接线标准 线序(备忘)「建议收藏」

    以太网RJ45 接线标准 线序(备忘)「建议收藏」RJ是RegisteredJack的缩写,意思是“注册的插座”。在FCC(美国联邦通信委员会标准和规章)中的定义是,RJ是描述公用电信网络的接口,常用的有RJ-11和RJ-45,计算机网络的RJ-45是标准8位模块化接口的俗称。568A的排线顺序从左到右依次为:白绿、绿、白橙、蓝、白蓝、橙、白棕、棕。568B的排线顺序从左到右依次为:白橙、橙、白绿、蓝、白蓝、绿、白棕、棕。所谓的交叉线是指:一端…

    2025年11月23日
    4
  • QTreeview custom

    QTreeview custom设定字体virtualQVariantMyModel::data(constQModelIndex&index,introle)const{if(index.isValid()&&role==Qt::ForegroundRole){if(index.column()==2){

    2022年5月22日
    38

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号