首页 > 其他分享 >数组拷贝之arraycopy

数组拷贝之arraycopy

时间:2022-12-21 16:13:22浏览次数:29  
标签:封装 dest System 数组 拷贝 方法 arraycopy

 

 

本文主要分两部分:

  1. 手动实现数组拷贝功能
  2. 使用并分析System类中的数组拷贝方法

1.手动实现数组拷贝功能

首先来看看我们的需求:有两个已知数组如上图,从src数组中拷贝3,4,5,6元素到dest数组中,需求这么简单?还么完呢铁子,将元素拷到dest数组中下标从5开始的地方(也就是3拷贝到dest[5],4拷贝到dest[6]以此类推)

分析一波吧,既然是拷贝功能,你得跟我说从哪里拷到哪里吧,这决定了我们的方法应该有源数组和目标数组这两个参数,观察上图,我们发先是从源数组索引2的位置复制4个元素到目标数组从索引5到索引8位置。由此不难想到,我们的方法应该有源数组的索引位置和目标数组的索引位置。有了这四个参数发现还不能实现我们的需求。最终加了一个复制的长度。

首先我是这样写的:一个数字一个数字进行拷贝。这时候我们发现代码好像是重复的,于是乎我们就可以将这部分代码进行封装了。

这是封装好的代码,使用for循环对上方法进行封装,这样我们的手动实现数组拷贝功能就完成了。

大眼一看好像没问什么问题吗,做的挺不错。可是这个方法存在问题,最主要的问题是该方法只能拷贝int类型的数组。 由此我么

2.System类中的数组拷贝方法

通过第一部分我们知道,上面封装的方法存在局限性。工作中我们可能遇到各种各样的数据,如果一中类型封装一个方法,那不是就不符合java封装的特点了。正是由于数组拷贝方法使用场景多,所以sun公司的大佬给我们封装好了方法,也就是本文的重点arraycopy方法。该方法在System类中,是一个静态方法,所以通过类名可以直接调用,比较方便。另外System类被final修饰,是不能被实例化的,这么做也是防止大家创建对象调用静态方法。

通过查看API发现封装的时候第一个参数跟第三参数是Object类型的,也就是说该方法可以实现任意类型数组的拷贝。另外,sun公司考虑到可能出现的问题并解决,使代码更加健壮(详细看下图,或者自己打开API看看)。所以通过这个文章我想给大家传达的是我们在平时学习中,只要知道在什么类中有什么方法即可。具体的我们可以查阅API(我曾经一直不知道什么叫API,其实API就是Java的帮助文档,可以理解为java中的新华字典)。所以文档在手,天下我有。

 

接下来我们把arraycope拿来用一下。等等你开篇不是说不要拿来主义。这里说明一下,我们在第一部分已经有了自己的思考,在这种情况下我们是可以使用封装好的方法提高开发效率的。一个很简单的例子,大家去饭店为了什么,为了方便。没有人到饭店,自己带着食材跑到饭店后厨跟厨子说,我自己炒个玩玩你闪开,然后夸夸一顿操作,然后自己做好了,端出来自己吃。所以说,厨子能做的砸门就直接让它们做,等着吃不香吗?谁还不会泡个面加个蛋哈哈,这不是基本操作。下面是具体代码:

public static void main(String[] args) {
		// 源数组
		int[] src = new int[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
		// 目标数组
		int[] dest = new int[10];
		System.out.println("cope前:" + Arrays.toString(dest));
//		copy(src, 2, dest, 5, 4);
		System.arraycopy(src, 2, dest, 5, 4);
		System.out.println("cope后:" + Arrays.toString(dest));
	}
相比上面的代码是不是简单了很多,这里arraycope的c没有大写是个历史遗留问题,所以不用纠结为什么它不是arrayCope。

标签:封装,dest,System,数组,拷贝,方法,arraycopy
From: https://www.cnblogs.com/shoshana-kong/p/16996441.html

相关文章

  • 从对象数组中提取某些属性组成新的对象数组
    letarrold=[{name:"name1",age:"1",date:'2016-05-03'},{name:"name2",age:"2",date:'2016-05-02'},......
  • JavaScript中数组中的方法
    将数组转换成字符串JavaScript方法 toString() 把数组转换为数组值(逗号分隔)的字符串。实例: varfruits=["Banana","Orange","Apple","Mango"]; ......
  • 求平均成绩(数组)
    求平均成绩 TimeLimit:2000/1000MS(Java/Others)    MemoryLimit:65536/32768K(Java/Others)TotalSubmission(s):92502    AcceptedSubmission(s):21......
  • Cpp Primer:Sec 13:拷贝控制
    目录Sec13拷贝控制13.1拷贝、赋值与销毁13.2拷贝控制和资源管理13.3交换操作13.4拷贝控制示例13.5动态内存管理类13.6对象移动13.6.1右值引用13.6.2移动构造函数......
  • [vue] Vue监测数据改变的原理 对象,数组
    Vue监测对象数据改变的原理<divid="root"><h2>学校名称:{{name}}</h2><h2>学校地址:{{address}}</h2></div>constvm=newVue({el:'#root',data:{name:'尚硅谷......
  • JAVA数组
    JAVA数组定义数组是相同类型数据的有序集合声明创建dataType[]arrayRefVar=newdataType[arraySize];数组的声明是通过索引访问的获取数组长度:arrays.length......
  • 如何在 .Net 7 中将 Query 绑定到数组
    在.Net7中,我们可以通过绑定数组的方式来接收来自查询字符串的参数。这样就不需要再使用逗号分隔的字符串来获取参数了。代码演示假设我们需要从query上接受多个id......
  • JS数组和字符串方法(API总结与应用)
    目录ArrayAPI静态方法数组首尾元素处理数组遍历(重要)数组查找数组过滤(重要)数组合并数组删除与截取数组排序StringAPI字符串查找与匹配字符串替换字符串合并字符串首尾空格......
  • C语言 写一个数字 在数组中查找到,下面以7为例子
    //intmain()//{//  intarr[]={1,2,3,4,5,6,7,8,9,10};//  intk=7;//   inti=0;//   intsz=sizeof(arr)/sizeof(arr[0]);//  ......
  • .Net7 自动拷贝appsettings.json到debug文件下
    IDERider在配置json时遇到路径的问题Theconfigurationfile'appsettings.json'wasnotfoundandisnotoptional.TheexpectedphysicalpathwasIConfiguration......