System.arrayCopy
介绍
System中提供了一个native静态方法arraycopy(),可以使用这个方法来实现数组之间的复制。
对于一维基础数据类型数组来说,这种复制属性值传递,修改副本不会影响原来的值。对于二维或者一维数组中存放的是对象时,复制结果是一维的引用变量传递给副本的一维数组,修改副本时,会影响原来的数组。
System.arrayCopy(Object srcArray,int srcPos,Object destArray ,int destPos,int length)
Object src : 原数组
int srcPos : 从元数据的起始位置开始
Object dest : 目标数组
int destPos : 目标数组的开始起始位置
int length : 要copy的数组的长度
示例
String[] array = new String[]{"1","2","3","4","5","6","7","8"};
String[] systemArrayTemp = new String[8];
System.arraycopy(array,3,systemArrayTemp,2,5);
//从数组array里面的第3个元素开始,拷贝到systemArrayTemp第2个元素之后的位置,长度是5,超出长度报错
System.out.println(Arrays.toString(systemArrayTemp));
运行结果
System.arraycopy(array,3,systemArrayTemp,2,5)
从数组array里面的第3个元素开始,拷贝到systemArrayTemp第2个元素之后的位置,长度是5
[null, null, 4, 5, 6, 7, 8, null]
Arrays.copyOf
介绍
Arrays的copyOf()方法传回的数组是新的数组对象,改变传回数组中的元素值,不会影响原来的数组。
copyOf()的第二个自变量指定要建立的新数组长度,如果新数组的长度超过原数组的长度,则保留数组默认值
public static <T> T[] copyOf(T[] original, int newLength) {
return (Object[])copyOf(var0, var1, var0.getClass());
}
original 需要拷贝的原始数组
newLength 拷贝元素长度,如果超出原始数组的长度则补充默认值,如int型则补充0
示例
String[] array = new String[]{"1","2","3","4","5","6","7","8"};
//Arrays.copyOf(array,3) 拷贝数组array里面的前3个元素
String[] arrayOfCopy = Arrays.copyOf(array,3);
System.out.println(Arrays.toString(arrayOfCopy));
//拷贝数组array的10个元素,因为数组总长才8,所以超出的补默认值null
String[] arrayOfCopyOut = Arrays.copyOf(array,10);
System.out.println(Arrays.toString(arrayOfCopyOut));
运行结果
Arrays.copyOf(array,3) 拷贝数组array里面的前3个元素
[1, 2, 3]
Arrays.copyOf(array,10) 拷贝数组array的10个元素,因为数组总长才8,所以超出的补默认值
[1, 2, 3, 4, 5, 6, 7, 8, null, null]
Arrays.copyOfRange
介绍
Arrays.copyOfRange方法复制指定的数组到一个新的数组,相比copyOf()可以指定需要复制元素的文职。
其中T[] original是要复制的数组,from是复制开始位置的元素的序号(包括这个元素),to复制结束位置的序号(不包括这个元素)
public static <T> T[] copyOfRange(T[] original, int from, int to) {
return copyOfRange(var0, var1, var2, var0.getClass());
}
original 需要拷贝的原始数组
from 拷贝开始元素的位置(从0开始计算)
to 拷贝结束元素的位置(从0开始计算),不包括当前位置,超出补充默认值
示例
String[] array = new String[]{"1","2","3","4","5","6","7","8"};
//拷贝数组array里面的第3个元素到第6个元素
String[] arrayOfCopyRange = Arrays.copyOfRange(array,2,6);
System.out.println(Arrays.toString(arrayOfCopyRange));
//拷贝数组array里面的第3个元素到第10个元素,超出2个补充默认值
String[] arrayOfCopyRangeOut = Arrays.copyOfRange(array,2,10);
System.out.println(Arrays.toString(arrayOfCopyRangeOut));
运行结果
Arrays.copyOfRange(array,2,6) 拷贝数组array里面的第3个元素到第6个元素
[3, 4, 5, 6]
Arrays.copyOfRange(array,2,10) 拷贝数组array里面的第3个元素到第10个元素,超出2个补充默认值
[3, 4, 5, 6, 7, 8, null, null]
完整示例
public class MyClass {
public static void main(String [] args){
String[] array = new String[]{"1","2","3","4","5","6","7","8"};
System.out.println("Arrays.copyOf(array,3) 拷贝数组array里面的前3个元素");
String[] arrayOfCopy = Arrays.copyOf(array,3);
System.out.println(Arrays.toString(arrayOfCopy));
System.out.println("");
System.out.println("Arrays.copyOf(array,10) 拷贝数组array的10个元素,因为数组总长才8,所以超出的补默认值");
String[] arrayOfCopyOut = Arrays.copyOf(array,10);
System.out.println(Arrays.toString(arrayOfCopyOut));
System.out.println("");
System.out.println("");
System.out.println("Arrays.copyOfRange(array,2,6) 拷贝数组array里面的第3个元素到第6个元素");
String[] arrayOfCopyRange = Arrays.copyOfRange(array,2,6);
System.out.println(Arrays.toString(arrayOfCopyRange));
System.out.println("");
System.out.println("Arrays.copyOfRange(array,2,10) 拷贝数组array里面的第3个元素到第10个元素,超出2个补充默认值");
String[] arrayOfCopyRangeOut = Arrays.copyOfRange(array,2,10);
System.out.println(Arrays.toString(arrayOfCopyRangeOut));
System.out.println("");
// Object src : 原数组
// int srcPos : 从元数据的起始位置开始
// Object dest : 目标数组
// int destPos : 目标数组的开始起始位置
// int length : 要copy的数组的长度
String[] systemArrayTemp = new String[8];
System.arraycopy(array,3,systemArrayTemp,2,5);
System.out.println("System.arraycopy(array,3,systemArrayTemp,2,5) 从数组array里面的第3个元素开始,拷贝到systemArrayTemp第2个元素之后的位置,长度是5,超出长度报错");
System.out.println(Arrays.toString(systemArrayTemp));
}
}
以上是结合参考资料自己的一些总结,如有错误欢迎指正
参考资料