欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

System.arraycopy()和 Arrays.copyOf()的区别联系(源码深度解析copyOf扩容原理)

发布时间:2024/10/14 编程问答 25 豆豆
生活随笔 收集整理的这篇文章主要介绍了 System.arraycopy()和 Arrays.copyOf()的区别联系(源码深度解析copyOf扩容原理) 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

1.System.arraycopy()方法

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length):将指定源数组中的数组从指定位置开始复制到目标数组的指定位置。

例子:

package untl; public class MyObject {public static void main(String[] args) {int arr[]={1,2,3,4,5,6,7,8};int brr[]=new int [10];System.arraycopy(arr,1,brr,3,5);for (int a: brr) {System.out.println(a);}} } 运行结果: 0 0 0 2 3 4 5 6 0 0

从例子我们可以得出参数的意思:

从src数组的第srcPos位置的元素开始后的length个元素复制到dest数组里以destPos索引为起始位置往后延申

2.Arrays.copyOf()方法

选择指定的数组,截断或填充空值(如果需要),使副本具有指定的长度。以达到扩容的目的

//Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。 //copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值 public static <T> T[] copyOf(T[] original, int newLength) {return (T[]) copyOf(original, newLength, original.getClass()); }/*** @Description 复制指定的数组, 如有必要用 null 截取或填充,以使副本具有指定的长度* 对于所有在原数组和副本中都有效的索引,这两个数组相同索引处将包含相同的值* 对于在副本中有效而在原数组无效的所有索引,副本将填充 null,当且仅当指定长度大于原数组的长度时,这些索引存在* 返回的数组属于 newType 类** @param original 要复制的数组* @param newLength 副本的长度* @param newType 副本的类* * @return T 原数组的副本,截取或用 null 填充以获得指定的长度* @throws NegativeArraySizeException 如果 newLength 为负* @throws NullPointerException 如果 original 为 null* @throws ArrayStoreException 如果从 original 中复制的元素不属于存储在 newType 类数组中的运行时类型*/public static <T,U> T[] copyOf(U[] original, int newLength, Class<? extends T[]> newType) {@SuppressWarnings("unchecked")T[] copy = ((Object)newType == (Object)Object[].class)? (T[]) new Object[newLength]: (T[]) Array.newInstance(newType.getComponentType(), newLength);System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength));return copy; }

例子:

public static void main(String[] args) {int[] a = new int[3];a[0] = 0;a[1] = 1;a[2] = 2;int[] b = Arrays.copyOf(a, 10);System.out.println("b.length " + b.length);for (int i : b) {System.out.print(i + " ");}} 运行结果: b.length10 0 1 2 0 0 0 0 0 0 0

3.两者的联系与区别:

联系:看两者源代码可以发现copyOf()内部调用了System.arraycopy()方法
区别:
1arraycopy()需要目标数组,将原数组拷贝到你自己定义的数组里,而且可以选择拷贝的起点和长度以及放入新数组中的位置
2.copyOf()是系统自动在内部新建一个数组,并返回该数组。

4.两者的对比:

1.从两种拷贝方式的定义来看:
System.arraycopy()使用时必须有原数组和目标数组,Arrays.copyOf()使用时只需要有原数组即可。
2.从两种拷贝方式的底层实现来看:
System.arraycopy()是用c或c++实现的,Arrays.copyOf()是在方法中重新创建了一个数组,并调用System.arraycopy()进行拷贝。
3.两种拷贝方式的效率分析:
由于Arrays.copyOf()不但创建了新的数组而且最终还是调用System.arraycopy(),所以System.arraycopy()的效率高于Arrays.copyOf()。

总结

以上是生活随笔为你收集整理的System.arraycopy()和 Arrays.copyOf()的区别联系(源码深度解析copyOf扩容原理)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。