java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别
java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别
一、java.lang.System.arraycopy()
该方法的声明:
/* @param src 源数组
* @param srcPos 源数组中的起始位置
* @param dest 目标数组
* @param destPos 目标数组中的起始位置
* @param length 需要被复制的元素个数
* @exception IndexOutOfBoundsException 如果在复制的过程中发生索引溢界异常
* @exception ArrayStoreException 如果源数组中的元素因为类型不匹配不能被复制到目标数组中
* @exception NullPointerException 如果源数组为null或者目标数组为null
*/
public static native void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length); //由修饰符native可知,该方法调用的为JDK中的底层函数
该方法实现的功能为:从指定源数组中指定的位置开始,依次将元素复制到目标数组的指定位置,复制的元素个数为length参数。即,
将数组src[srcPos, ..., srcPos+length-1]中的元素复制到数组dest[destPos, ..., destPos+length-1]中。
如果源数组(src)和目标数组(dest)为相同的数组对象,则复制过程为:
① 将源数组中需复制的元素src[srcPos, ..., srcPos+length-1]复制到一个临时数组中,长度为length;
② 然后将临时数组中的内容复制到目标数组dest[destPos, ..., destPos+length-1]中。
二、java.util.Arrays.copyOf()
该方法的声明:
/* @param <T> 数组中元素的类型
* @param original 被复制数组
* @param newLength 返回的数组的长度
* @return 返回源数组的一个“副本”,为了去达到指定的长度,必要情况下需截断或用null值填充
* @throws NegativeArraySizeException 如果参数newLength为负值
* @throws NullPointerException 如果参数original为null
* @since 1.6
*/
@SuppressWarnings("unchecked")
public static <T> T[] copyOf(T[] original, int newLength) {
return (T[]) copyOf(original, newLength, original.getClass());
} /* @param <U> 源数组中元素的类型
* @param <T> 返回数组中元素的类型
* @param original 被复制数组
* @param newLength 返回的数组的长度
* @param newType 返回数组的类型
* @return 返回源数组的一个“副本”,为了去达到指定的长度,必要情况下需截断或用null值填充
* @throws NegativeArraySizeException 如果参数newLength为负值
* @throws NullPointerException 如果参数original为null
* @throws ArrayStoreException 如果源数组中的元素不能被复制到类型为newType的数组中
* @since 1.6
*/
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] //(返回数组)的类型为Object[]时
: (T[]) Array.newInstance(newType.getComponentType(), newLength); //用newType的组件类型,长度newLength去创建一个新的数组
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength)); //截断或用null值填充
return copy;
}
//java.util.Arrays重载了很多copyOf()方法
public static int[] copyOf(int[] original, int newLength) {
int[] copy = new int[newLength];
System.arraycopy(original, 0, copy, 0,
Math.min(original.length, newLength));
return copy;
}
该方法实现的功能为:按指定的长度复制给定的源数组,必要情况下需截断或用null值填充。
Arrays.copyOf()的实现方式是:
① 内部新建一个长度为指定长度参数newLength的数组copy[];
② 调用System.arraycopy(original, 0, copy, 0,Math.min(original.length, newLength))完成对数组复制的功能
if(original.length >= newLength) 截断original[];original[0, ..., newLength-1] -> copy[0, ..., newLength-1]
if(original.length < newLength) 用null值填充;original[0, ..., original.length-1] -> copy[0, ..., original.length-1]
nulls -> copy[original.length, ..., newLength-original.length+1]
③ 返回一个长度为newLength的数组copy[],元素为②中得到的对应值
三、异同
1) Arrays.copyOf()内部是通过System.arraycopy()实现的。
2) System.arraycopy()通过对srcPos,destPos的设置完成对数组的任意部分复制功能;而Arrays.copyOf()只能从下标为0的元素开始复制。
3)System.arraycopy()中会因为srcPos+length > src.length 或 destPos+length > dest.length而报ArrayIndexOutOfBoundsException;而Arrays.copyOf()中不会因此而报错,因为Arrays.copyOf()返回的为方法内部新建的一个指定长度的数组。
String[] a = {"a","b","c","d","e"};
String[] b = new String[4];
//System.arraycopy(a, 0, b, 0, ); //java.lang.ArrayIndexOutOfBoundsException
//b = Arrays.copyOf(a, 4); //截断a[],b={"a","b","c","d"}
b = Arrays.copyOf(a, 5); //b={"a","b","c","d","e"}
//b = Arrays.copyOf(a, 6); //null值填充,b={"a","b","c","d","e",null}
4) 在System.arraycopy()方法中,如果目标数组dest==null,则会报NullPointerException;而Arrays.copyOf()中不会因此而报错。
String[] a = {"a","b","c","d","e"};
String[] b = null;
//System.arraycopy(a, 0, b, 0, 5); //java.lang.NullPointerException
b = Arrays.copyOf(a, 5); //b={"a","b","c","d","e"}
5)System.arraycopy()方法中目标数组作为参数;而Arrays.copyOf()中目标数组作为返回值。
6) System.arraycopy()方法和Arrays.copyOf()方法均可以实现数组类型的向上转换,即子类型的数组可以复制到父类型数组中;但不可以实现向下转换,即父类型的数组不可以复制到子类型数组中。
class A {}
class B extends A{}
A a1 = new A();
A[] parent = {a1,a1,a1,a1,a1};
B[] child = new B[5];
//child = (B[]) Arrays.copyOf(parent, 5); //java.lang.ClassCastException
//System.arraycopy(parent, 0, child, 0, 5); //java.lang.ArrayStoreException
B b1 = new B();
B[] child = {b1,b1,b1,b1,b1};
A[] parent = new A[5];
//parent = Arrays.copyOf(child,5); //复制成功
//System.arraycopy(child, 0, parent, 0, 5); //复制成功
java.lang.System.arraycopy() 与java.util.Arrays.copyOf()的区别的更多相关文章
- Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
最近下载一个新版本的adt-bundle,Android API是20. 把Plain Text控件往布局上面拖时,发现拖不上去,出现了下面的错误: Exception raised during r ...
- ECLIPSE android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
在布局添加控件手动添加还是拖的添加,添加edittext后布局就不好用,其他控件好用,然后就说下面这段话 Exception raised during rendering: java.lang.Sy ...
- android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[CII)V
今天在看布局文件的时候出现 android 布局页面文件出错故障排除Exception raised during rendering: java.lang.System.arraycopy([CI[ ...
- 解决 Xamarin 拖拽Plain Text 于Layout上时 出现 “The layout could not be loaded:java.lang.System.arraycopy([CI[CII)V” 错误
右键项目属性
- java.util.Arrays,java.lang.Math,java.lang.System 类的常用方法汇总
java.util.Arrays类是数组的工具类,一般数组常用的方法包括 二分查找:public static int binarySearch(array[],int key),返回key的下标i ...
- java的system.arraycopy()方法
java.lang.System的静态方法arraycopy()可以实现数组的复制,讲课的老师说这个方法效率比较高,如果数组有成千上万个元素,那么用这个方法,比用for语句循环快不少.于是我试了试,发 ...
- java.lang.system 类源码解读
通过每块代码进行源码解读,并发现源码使用的技术栈,扩展视野. registerNatives 方法解读 /* register the natives via the static initializ ...
- JavaSE-基础语法(二)-系统类(java.lang.*)和工具类(java.util.*)
系统类(java.lang.*)和工具类(java.util.*) 一.系统类(java.lang.*) 这个包下包含java语言的核心类,如String.Math.System和Thread类等,使 ...
- Spring MVC exception - Invoking request method resulted in exception : public static native long java.lang.System.currentTimeMillis()
最近在线上系统发现下面的异常信息: 2014-10-11 11:14:09 ERROR [org.springframework.web.servlet.mvc.annotation.Annotati ...
随机推荐
- MapReduce编程之Map Join多种应用场景与使用
Map Join 实现方式一:分布式缓存 ● 使用场景:一张表十分小.一张表很大. ● 用法: 在提交作业的时候先将小表文件放到该作业的DistributedCache中,然后从DistributeC ...
- Beta阶段DAY1
一.提供当天站立式会议照片一张 二.每个人的工作 1.讨论项目每个成员的昨天进展 刘阳航:了解了自己再beta阶段的安排,但因为考试,有心无力. 林庭亦:颜色设置的相关代码的查看. 郑子熙:和另一位组 ...
- vue开发完成后打包后图片路径不对
用vue做了一个小的移动端项目,从头到尾做下来,感觉自己好多东西都没弄清楚过.也学到了很多,已整理笔记在自己电脑上,但是比较零散,空了再来仔细整理整理. 于是,上周五模拟好数据(接口还未写),准备打包 ...
- 【转】python win32api win32gui win32con 简单操作教程(窗口句柄 发送消息 常用方法 键盘输入)
作者:https://blog.csdn.net/qq_16234613/article/details/79155632 附:https://www.programcreek.com/python/ ...
- Powershell笔记之MVA课程
很早之前看过MVA的Powershell课程,最近准备回顾一下,还是有一些意外的收获. <<快速入门 : PowerShell 3.0 高级工具和脚本>> 1. Invoke- ...
- MSTSC 修改端口的简单方法 3389
1. 3389端口太过危险 最简单的办法是 修改默认端口方法非常简单. 2. win+r 打开运行, 输入 regedit 打开 注册表 3. 在地址栏输入 远程的服务的路径 输入的内容为: 计算机 ...
- css中定位功能的特性
它有四大特性,页面找不到盒子的情况 1.z-index值表示谁压着谁,数值大的压盖数值小的 2.只有定位了的元素,才有z-index.也就是说,不管相对定位,绝对定位,固定定位,都可以使用z-inde ...
- Install .Net Core For CentOS
Install .NET Core SDK Before you start, please remove any previous versions of .NET Core from your s ...
- java 常量 因为常量不依赖对象 所以一般都会将常量设置为 类属性
- python selenium2 窗口切换实例
遍历hao123中某一区域的所有链接,点击每个链接时,会打开新的窗口,获取新窗口的title后关闭窗口,切换到初始窗口继续打开下一个链接 代码如下: #coding=utf-8 from seleni ...