Java中copy一维数组以及其他数据结构转换为数组
1.一维数组的copy
数组类型的copy一般找API中Arrays类以及Object类的方法
1.1使用Arrays的copyOf方法
这是javaAPI上Arrays类的方法看到他们都是静态方法且支持基本数据类型以及泛型,
同时做个测试观察这个方法是深拷贝还是浅拷贝
@Test
public void test01(){
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr1, 5);
for(int num:arr2){
System.out.println(num);
}
System.out.println(arr1);
System.out.println(arr2);
}
测试结果为
1
2
3
4
5
[I@4ee285c6
[I@621be5d1
可以观察到执行此方法是浅拷贝
可以看到官方API说
Copies the specified array, truncating or padding with zeros (if necessary) so the copy has the specified length.
复制指定的数组,截断或用零填充(如果需要),使副本具有指定的长度。
所以我们第二个参数可以大于原数组长度但不能小于0
1.1.1第二个参数大于原数组长度
当第二个参数超过原数组的下标
public void test01(){
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr1, 9);
for(int num:arr2){
System.out.println(num);
}
}
结果为
1
2
3
4
5
6
0
0
0
1.1.2第二个参数等于0
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr1, 0);
for(int num:arr2){
System.out.println(num);
}
结果什么都没有,这是显而易见的新数组长度为0
1.1.3第二个参数小于0
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2 = Arrays.copyOf(arr1, -1);
for(int num:arr2){
System.out.println(num);
}
结果抛出异常
2.1使用Arrays类的copyOfRange方法
官方API
copy的是原数组的 [from,to)的下标
测试:
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2=Arrays.copyOfRange(arr1,0,4);
for(int num:arr2){
System.out.println(num);
}
System.out.println(arr1);
System.out.println(arr2);
结果为:
1
2
3
4
[I@4ee285c6
[I@621be5d1
也是浅拷贝
3.1Object类的clone方法
测试:
int[] arr1=new int[]{1,2,3,4,5,6};
int[] clone = arr1.clone();
for(int num:clone){
System.out.println(num);
}
System.out.println(arr1);
System.out.println(clone);
结果为
1
2
3
4
5
6
[I@4ee285c6
[I@621be5d1
结果也是浅拷贝
4.1System类的copyArray方法
这是个静态无返回值的方法,所以需要有两个数组然后将一个数组的一部分copy到另一个数组
test:
int[] arr1=new int[]{1,2,3,4,5,6};
int[] arr2=new int[]{4,5,6,7,8,9};
System.arraycopy(arr1,2,arr2,3,2);
for(int num:arr2){
System.out.println(num);
}
result:
4
5
6
3
4
9
当长度过大使某一个数组下标超过长度时时抛出下标溢出异常
java.lang.ArrayIndexOutOfBoundsException
at java.lang.System.arraycopy(Native Method)
at ArrayTest.test03(ArrayTest.java:32)
这也是浅拷贝
1.5深拷贝
int[] arr1=new int[]{1,2,3};
int[] arr2=arr1;
arr2[0]=5;
for(int num:arr1){
System.out.println(num);
}
5
2
3
2.其他数据结构转换为数组
查找API看哪些数据结构支持转换为数组,以及查看它们父类是否支持转换为数组
2.1实现Collection的类转换为数组
2.1.1无参
Set<Integer> set=new HashSet<>();
set.add(1);set.add(2);set.add(3);
Object[] arr = set.toArray();
for(Object num:arr){
System.out.println(num);
}
这里不能直接强转为Integer[]
尽管他每个存储的都是Integer但是强转的前提是被强转的类是强转后的父类,但是Integer[]是Object的子类而不是Object[]的子类,所以要使用有参的函数来转换
2.1.2有参函数
test
Set<Integer> set=new HashSet<>();
set.add(1);set.add(2);set.add(3);
Integer[] arr = set.toArray(new Integer[set.size()]);
for(Object num:arr){
System.out.println(num);
}
result:
1
2
3