System.arraycopy之数组复制,基础知识。

来源:互联网 发布:do as infinity 知乎 编辑:程序博客网 时间:2024/06/04 18:12

说来惭愧,本人入行尚浅,因为学校没好好学习,基础知识十分差劲,买了基本基础java的书,也是看了一个月就放下了,尴尬

 java 的一些方法 知道归 知道,但是不知道真正的原理和使用方法,今天来说一下 本菜鸡 遇到的 基础知识的坑。


System.arraycopy(Object src,                       //要拷贝的数组, 

                                   int  srcPos,                       //不能超出你要拷贝数组的长度,

                                  Object dest,                      //目标数组,

                                   int destPos,                     //不能超出你目的数组的长度,

                                       int length                      //不能超出你目的数组的长度 

                                   )                

 本来 如此简单的一个问题,其实大佬在写的时候会正常 使用,并不出问题,但是菜鸡就不一样了。


错误案例:

 

需求需要,比如我想把num 2  num3 的 数组累加到 num1后面,要把5个byte[] 包整合成一个 byte[],]

 ps :byte [] addnumber ={1, 2, 3, 4, 5,6, 7, 8, 9,10, 11, 12, 13, 14, 15, 16};

  拼接成这个样子的数组


start coding:

 byte[] num1 = {1, 2, 3, 4, 5};

 byte[] num2 = {6, 7, 8, 9};

 byte[] num3 = {10, 11, 12, 13, 14, 15, 16};

 byte[] addNnmber= num1;

 System.arraycopy(num1, 0, addNnmber, addNnmber.length, num1.length);

 System.arraycopy(num2, 0, addNnmber, addNnmber.length, num2.length);

System.arraycopy(num3, 0, addNnmber, addNnmber.length,num3.length);

 mTv_Context.setText(Arrays.toString(addNnmber));


end coding:

最后的结果就是 无限的 数组越界,不明原理的我查阅资料,但是没人说出这个这么基础的问题,清一色都是那种 成功的案例,果然基础很差 就在开发中 很难扩展和延伸。

后来我才自己demo 测试,知道,目标数组在copy前的 length 长度 不会被 扩展,比如 addNnmber 现在是{1,2,3,4,5}, 我以为在  arraycopy 后在后面增加为{1,2,3,4,5,6,7,8,9};自动扩展。 其实很基础的大家都是知道的 arraycopy  一开始在new byte[] 被定好了 长度,所以后期复制,只能覆盖同样的长度,如果想跟贪吃蛇一样增加长度 是不可能的,我天真以为 可以跟String 一样 在后面增加数组的length。

所以 ,如果你知道你要拼接的字体是多少,就在一开始就定义好 数组长度。下面有正确的例子。


正确案例:

 byte[] num1 = {1, 2, 3, 4, 5};

 byte[] num2 = {6, 7, 8, 9};

 byte[] num3 = {10, 11, 12, 13, 14, 15, 16};

byte[] addNnmber  = new byte[num1.length + num2.length + num3.length];

 System.arraycopy (num1, 0, addNnmber, 0, num1.length);

 System.arraycopy(num2, 0, addNnmber, num1.length, num2.length);

System.arraycopy(num3, 0, addNnmber, num1.length +num2.length, num3.length);

 mTv_Context.setText(Arrays.toString(addNnmber));


其实,都不好意思当成博客来写,但是我发现我在查找System.arraycopy 这个属性的时候,没有一篇博客说道这个基础的问题,虽然基础,但也把我绊了一下,算是没有好好学习基础知识的教训把。                                反正博主的博客啥乱七八糟的都写。不喜勿碰。




原创粉丝点击