3分钟带你搞定System.arrayCopy和Arrays.copyOf

让你头疼的数组拷贝演示


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具体使用:

  1. copyOf一般是两个参数,第一个是你要拷贝的数组,第二个是你想拷贝的长度,如果<=拷贝数组的长度,那么结果就是被拷贝数组的前(你设置的长度)个数据;如果长度超过其余自动被赋值0
  2. 返回值是一个数组对象,这个是必须的,它不想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()实现,原来到最后都是不是一家人,不进一家门

好了本期介绍到这了,觉得不错的记得关注一下下咯
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值