Arrays.copyOfRange学习
Arrays.copyOfRange的使用方法
功能:实现数组的拷贝功能,将数组拷贝至另外一个数组
参数:
original:第一个参数为要拷贝的数组对象 from:第二个参数为拷贝的开始位置(包含) to:第三个参数为拷贝的结束位置(不包含)
有多个重载方法,可以复制各种类型的数组。
示例:
import java.util.*; public class leetcode { public static void main(String[] args) { int[] array = {0, 1, 2, 3, 4, 5, 6,7,8}; int[] array2 = Arrays.copyOfRange(array, 2, 6); System.out.println(Arrays.toString(array2)); } }
输出:
[2, 3, 4, 5] 注意不包含右边界
源码解析
copyOfRange()方法的源码如下:
在该方法内做了四件事:
(1)计算新数组的长度,由于指定了开始索引和结束索引,所以新数组的长度是可以计算的。
(2)创建一个数组,该数组用来存放复制的元素。
(3)调用System.arraycopy()方法来复制数组,注意srcPos参数的值变为了from,即源数组的起始索引,而复制的结果数组当然是从索引为0的位置开始填充元素。
(4)返回复制完成的结果数组。
与之类似的方法:copyOf()
/* public static <T> T[] copyOf(T[] original, int newLength) 方法说明: 属于Arrays类的静态方法,可以通过类名直接调用,作用是复制指定长度的数组 参数说明: T[] original 泛型,指的是要传入的源数组,即会被复制的数组,可以是String[],Integer[]等,有多个重载方法 int newLength 整型,指的是要复制的长度,也是新数组的长度 1.如果newLength不合法,即小于0,那么抛出NegativeArraySizeException异常 2.如果newLength小于源数组长度,则复制指定长度的数组元素 3.如果newLength大于源数组长度,则新数组中超出源数组长度的元素则是默认值 返回值说明: T[] 返回的是一个泛型,指的是复制成功的结果数组 */
其也有多个重载方法,能够复制各种类型的数组:
示例:
public class Demo { public static void main(String[] args) { String[] originArr = new String[]{"张三", "李四", "王五", "赵六"}; String[] newArr = Arrays.copyOfRange(originArr, 1, 3); printArr(newArr); } static void printArr(String[] arr) { for (String s : arr) { System.out.print(s + "\t"); } System.out.println(); } } /** * 打印结果: * 李四 王五 */
源码解析
copyOf()方法的源码如下:
在该方法内做了三件事:
(1)创建一个数组,该数组是复制的结果数组。
(2)调用System类的arraycopy()方法复制数组,注意其实索引都是0,表示从第一个元素开始复制。
(3)返回复制完成的数组。
System.arraycopy()方法
发现copyOf()和copyOfRange()方法的底层都是调用System.arraycopy()方法实现。
System.arraycopy()方法说明:
/* public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length); 方法说明: 属于System类的静态方法,可以通过类名直接调用,作用是复制从指定索引开始的指定长度的数组 参数说明: Object src 源数组,可以是任何类型的 int srcPos 源数组的起始索引,即要复制的源数组的开始位置,结束位置通过长度来锁定 Object dest 目标数组,也就是复制的结果数组 int destPos 目标数组的起始位置,一般从0开始,也可以是其他索引 int length 要复制的元素个数 注意事项: 1.该方法被native修饰,表示底层使用C或C++实现的,不属于Java范畴 */
System.arraycopy()方法的源码:
没有任何实现的方法体,使用了native修饰方法,表示底层使用C或C++实现,不属于Java范畴。
Ref:(97条消息) Java高级之Arrays类的copyOf()和copyOfRange()方法以及System.arraycopy()方法介绍_二木成林的博客-CSDN博客_copyofrange