星星之火-JAVA数组复制的五种方法

本文最后更新于:December 5, 2021 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。

目录

1.for遍历

直接for进行遍历。不多说。╭(╯^╰)╮

2.直接赋值。

1
2
3
4
5
6
7
int[] a={2,4,2,9,1,3,6,5,65,56,4,5,6,5};
int[] b = new int[200];
b = a;
System.out.println(Arrays.toString(b));
/*
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5]
*/

3.数组的clone()方法

clone()方法我们在数组中是找不到的,它是object的方法,它的源码:

1
2
3
4
protected native Object clone() throws CloneNotSupportedException;
/*
看到了修饰符native,说明是由c或者c++实现的,它的优点是速度快,它返回了object对象,所以使用的时候需要用对象接收返回值。native关键字说明其修饰的方法是一个原生态方法,方法对应的实现不是在当前文件,而是在用其他语言(如C和C++)实现的文件中。Java语言本身不能对操作系统底层进行访问和操作,但是可以通过JNI接口调用其他语言来实现对底层的访问。
*/

使用方法:

1
2
3
4
5
6
7
int[] a={2,4,2,9,1,3,6,5,65,56,4,5,6,5}
int[] b= new int[50];
b = a.clone();
System.out.println(Arrays.toString(b));
/*
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5]
*/

4.System.arraycopy()方法(重点)

使用:public static native void arraycopy(Object src,int srcPos,Object dest,int desPos,int length)

需要注意,新的数组多余的会自动补0。且System.arraycopy()比clone()方法快。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int[] a={2,4,2,9,1,3,6,5,65,56,4,5,6,5};
int[] b = new int[20];
System.arraycopy(a,0,b,0,10);
System.out.println(Arrays.toString(b)); //

System.arraycopy(a,0,b,0,a.length);
System.out.println(Arrays.toString(a)); //
System.out.println(Arrays.toString(b)); //

System.out.println(b.length);
/*
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5]
[2, 4, 2, 9, 1, 3, 6, 5, 65, 56, 4, 5, 6, 5, 0, 0, 0, 0, 0, 0]
20(包括了多余的0,即等于数组开的大小)
*/

4.1 源码

1
2
3
public static native void arraycopy(Object src,  int  srcPos,
Object dest, int destPos,
int length);

5.Arrays类的copyOf()方法和copyOfRange()方法

5.1 Arrays.copyOf()方法

很显然,
如果newLength小于源数组的长度,则将源数组的前面若干个元素复制到目标数组。
如果newLength大于源数组的长度,则将源数组的所有元素复制到目标数组(这种方式的数组需要注意,见样例)。

它在方法内部调用了System.arraycopy(),只是相当于重写了一下,换了一个名字。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
int[] a={2,4,2,9,1,3,6,5};
int[] b = new int[303];
b = Arrays.copyOf(a,5);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));

b = Arrays.copyOf(a,15);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
System.out.println(b.length);
/*
[2, 4, 2, 9, 1, 3, 6, 5]
[2, 4, 2, 9, 1]

[2, 4, 2, 9, 1, 3, 6, 5]
[2, 4, 2, 9, 1, 3, 6, 5, 0, 0, 0, 0, 0, 0, 0]
15(包括了多余的0)
*/

5.1.1 源码

1
2
3
4
5
6
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;
}

5.2 copyOfRange()方法

1
2
3
4
5
6
7
8
9
int[] a={2,4,2,9,1,3,6,5,43,34,2,1};
int[] b = new int[303];
b = Arrays.copyOfRange(a,1,8);
System.out.println(Arrays.toString(a));
System.out.println(Arrays.toString(b));
/*
[2, 4, 2, 9, 1, 3, 6, 5, 43, 34, 2, 1]
[4, 2, 9, 1, 3, 6, 5]
*/

5.2.1 源码

1
2
3
4
5
6
7
8
9
public static int[] copyOfRange(int[] original, int from, int to) {
int newLength = to - from;
if (newLength < 0)
throw new IllegalArgumentException(from + " > " + to);
int[] copy = new int[newLength];
System.arraycopy(original, from, copy, 0,
Math.min(original.length - from, newLength));
return copy;
}

可自行查看这些方法的源码。