Array数组的复制
Arrays.copyOfRange
1、使用 Arrays.copyOfRange(T[] original, int from, int to) 方法
⚠️ 复制的区间范围,前闭后开[from,to)
- original参数:要复制范围的原始数组
- from参数:要复制的区间范围的初始索引(from必须位于0和原始数组的长度之间,可以等于数组的长度但不能大于数组长度)
- to参数:要复制的区间范围的结束索引(to必须大于或等于初始索引from,可以超出数组长度,超出部分会补齐数组对应数据类型的默认值)
- 返回一个新数组,新数组长度为to - from;超出原始数组范围的部分会填充数组对应的数据类型的默认值(int、char类型定义的数组默认值为0,double、float类型定义的数组默认值为0.0,String类型定义的数组默认值为null,boolean类型定义的数组默认值为false)
以初始索引from和结束索引to的几种取值情况举例
String[] arr = {"a","b","c","d","e","f","g"}; //length = 7 //0<初始索引<数组长度 && 结束索引<=数组长度 (正常复制) String[] arr1= Arrays.copyOfRange(arr, 1, 5); System.out.println(Arrays.toString(arr1)); //[b, c, d, e] //初始索引<数组长度 && 结束索引>数组长度 (超出部分填充默认类型) String[] arr2 = Arrays.copyOfRange(arr, 5, 10); System.out.println(Arrays.toString(arr2)); //[f, g, null, null, null] //初始索引>=数组长度 && 结束索引 > 数组长度 (全为默认值,无意义) String[] arr3 = Arrays.copyOfRange(arr, 7, 10); System.out.println(Arrays.toString(arr3)); //[null, null, null] //初始索引 = 结束索引 (前闭后开,返回一个空数组) String[] arr4 = Arrays.copyOfRange(arr, 5, 5); System.out.println(Arrays.toString(arr4)); //[]
System.arraycopy
使用 System.arraycopy(Object src, int srcPos,Object dest, int destPos,int length) 方法
- src参数:源数组(要被复制的数组)
- srcPos参数:源数组中的起始位置(开始复制的下标)
- dest参数:目标数组(要操作的数组)
- destPos参数:目标数组中的起始位置(从目标数组指定位置开始复制)
- length参数:要复制的数组元素的数量
⚠️️src源数组与目标数组数据类型需相同
⚠️️ 源数组起始位置+复制长度 与 目标数组起始位置+复制长度的值均不能超过数组长度 (srcPos+length<src.length) && (destPos+length<dest.length)
⚠️️两个不同数组间的复制,不会影响源数组的值
自身->自身(相同数组间)的复制
//操作自身数组,实现自身复制修改的功能 int[] nums = {1,2,3,4,5,6,7}; //从nums数组的0下标处开始复制4位到num数组的从3下标处开始的4位 System.arraycopy(nums,0,nums,3,4); System.out.println(Arrays.toString(nums)); //[1, 2, 3, 1, 2, 3, 4]
a数组->b数组(不同数组间)的复制
//从a数组复制到b数组 int[] arr1 = {66,88,99,111}; int[] arr2 = {1,2,3,4,5,6,7}; //从arr1数组的1下标处开始复制2位(88,99)到arr2数组的4下标处开始的2位 System.arraycopy(arr1,1,arr2,4,2); System.out.println(Arrays.toString(arr1)); //[66, 88, 99, 111] System.out.println(Arrays.toString(arr2)); //[1, 2, 3, 4, 88, 99, 7]