【编程基础】System.arraycopy()和 Arrays.copyOf()

在Java中如果要copy一个数组有两种系统api可以使用System.arraycopy()和Arrays.copyOf()。那么这两个方法有什么不同吗?下面一个例子来给大家展示一下:

1、System.arraycopy()

int[] arr = {1,2,3,4,5};
int[] copied = new int[10];
System.arraycopy(arr, 0, copied, 1, 5);//5 is the length to copy
System.out.println(Arrays.toString(copied));

Output:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 1, 2, 3, 4, 5, 0, 0, 0, 0]

2、Arrays.copyOf()

int[] copied = Arrays.copyOf(arr, 10); //10 the the length of the new arraySystem.out.println(Arrays.toString(copied)); copied = Arrays.copyOf(arr, 3);System.out.println(Arrays.toString(copied));

Output:

[1, 2, 3, 4, 5, 0, 0, 0, 0, 0]
[1, 2, 3]

两种方法的不同之处在于Arrays.copyOf是通过创建一个新的数组来实现的copy,源码如下:

int[] copied = Arrays.copyOf(arr, 10); //10 the the length of the new array
System.out.println(Arrays.toString(copied)); 
copied = Arrays.copyOf(arr, 3);
System.out.println(Arrays.toString(copied));

System.arraycopy()是往一个已经存在的数组copy,函数源码如下:

public static native void arraycopy(Object src, int srcPos,

Object dest, int destPos,

int length);

src - 源数组。 srcPos - 源数组中的起始位置。 dest - 目标数组。 destPos - 目标数据中的起始位置。 length - 要复制的数组元素的数量。 该方法是用了native关键字,调用的为C++编写的底层函数,可见其为JDK中的底层函数。

总结: 1.copyOf()的实现是用的是arrayCopy()。 2.arrayCopy()需要目标数组,对两个数组的内容进行可能不完全的合并操作。 3.copyOf()在内部新建一个数组,是用arrayCopy()将oldArray内容复制到newArray中去,并且长度为newLength,返回newArray。

原文发布于微信公众号 - 程序员互动联盟(coder_online)

原文发表时间:2015-06-01

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏拭心的安卓进阶之路

Java 集合深入理解(7):ArrayList

今天心情有点美丽,学学 ArrayList 放松下吧! 什么是 ArrayList ? ? ArrayList 是 Java 集合框架中 List接口 的一个实...

1917
来自专栏皮皮之路

【JDK1.8】JDK1.8集合源码阅读——ArrayList

714
来自专栏MelonTeam专栏

ArrayList源码完全分析

导语: 这里分析的ArrayList是使用的JDK1.8里面的类,AndroidSDK里面的ArrayList基本和这个一样。 分析的方式是逐个API进行解析 ...

3529
来自专栏积累沉淀

JDK源码分析-ArrayList分析

花了两个晚上的时间研究了一下ArrayList的源码, ArrayList 继承自AbstractList 并且实现了List, RandomAccess,...

1685
来自专栏Java Edge

AbstractList源码解析1 实现的方法2 两种内部迭代器3 两种内部类3 SubList 源码分析4 RandomAccessSubList 源码:AbstractList 作为 Lis

它实现了 List 的一些位置相关操作(比如 get,set,add,remove),是第一个实现随机访问方法的集合类,但不支持添加和替换

252
来自专栏Android知识点总结

Java容器源码攻坚战--第二战:ArrayList

912
来自专栏赵俊的Java专栏

从源码上分析 ArrayList

1081
来自专栏拭心的安卓进阶之路

Java 集合深入理解(6):AbstractList

今天心情比天蓝,来学学 AbstractList 吧! ? 什么是 AbstractList ? AbstractList 继承自 AbstractCollec...

18210
来自专栏java闲聊

JDK1.8 ArrayList 源码解析

当运行 ArrayList<Integer> list = new ArrayList<>() ; ,因为它没有指定初始容量,所以它调用的是它的无参构造

1132
来自专栏移动开发

Arrays.asList java.lang.UnsupportedOperationException 异常

但是有一小点注意,不能对该方法返回的list进行增删操作,因为该方法返回的是Arrays的内部类 Arrays.asList源码:

742

扫码关注云+社区