让你头疼的数组拷贝演示
Systems.arrayCopy和Arrays.copyOf
先来简单的吧:Arrays.copyOf
见名知意 copyOf(这里简写了,主要是我太懒了)就是单纯的数据拷贝,换句话说,这有一个数组你不顺眼,OK,你说不爽那就换:
int[] num= {1,20,31,4,10};
int[] newArr=Arrays.copyOf(num, 5);
for (int i : newArr) {
System.out.print(i+" ");
}
输出结果
1 20 31 4 10
就是这么简单粗暴,那么有一个问题,为啥不采用int[] newArr=num;岂不是更简单,何必多此一举,
答案显而易见,口说无凭,还是放个代码吧
int[] num= {1,20,31,4,10};
int[] newArr=Arrays.copyOf(num, 3);
for (int i : newArr) {
System.out.print(i+" ");
}
System.out.println();
int[] n2=num;
for (int i : n2) {
System.out.print(i+" ");
}
1 20 31
1 20 31 4 10
注意观察,如果只是简单数组赋值二者自然区别不大,但是如果你想动态拷贝数组的某部分内容,那copyOf就派上用场啦,大家应该注意到了这一句Arrays.copyOf(num, 3),这也是我要接下来说明Copyof具体使用:
- copyOf一般是两个参数,第一个是你要拷贝的数组,第二个是你想拷贝的长度,如果<=拷贝数组的长度,那么结果就是被拷贝数组的前(你设置的长度)个数据;如果长度超过其余自动被赋值0
- 返回值是一个数组对象,这个是必须的,它不想System.arrayCopy不需要返回值,稍后在说
3.copyOf有一个最大的优点就是,拷贝数组不改变的原数组的内容,等会你看我比较System.arrayCopy你就明白了
System.arrayCopy()
先说说他怎么用吧
System.arraycopy(src, srcPos, dest, destPos, length);
src:被拷贝数组 srcPos:被拷贝数组从哪里开始呢 dest:目标数组 destPos:目标从哪里开始呢 length:要拷贝多长呢
一样通过一个例子来看看:
int[] num= {1,20,31,4,10};
int[] dest=new int[5];
System.arraycopy(num, 0,dest, 0, 5);
for (int i : dest) {
System.out.print(i+" ");
}
System.out.println();
1 20 31 4 10
感觉好像没啥是吧,别急咱变个戏法,好下面我更改第三处代码
System.arraycopy(num, 2,dest, 3, 2);
0 0 0 31 4
我的意图是从num的下标2处开始依次取出两个数放在dest下标为3开始处
再看当我把代码在做一下手脚
System.arraycopy(num, 2,dest, 3, 3);
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at Test.Test.main(Test.java:12)
哦吼,异常了,为啥呢,原来使用System.arrayCopy必须只能使用<=原数组的长度,一旦超出就会发生异常!
Ok,看到这相比对System.arrayCopyOf有所了解了吧,总结一下
总结
1.System.arrayCopy没有返回值,copyOf有
2..System.arrayCopy只能为新数组申请<=待拷贝的数组长度,CopyOf则没有限制
3.通过观察源码发现,Copyof实现也是通过System.arrayCopy()实现,原来到最后都是不是一家人,不进一家门
好了本期介绍到这了,觉得不错的记得关注一下下咯