数组的复制/克隆
1.浅克隆
将原来数组的地址赋值给新数组,两个数组名指向了同一个数组,修改其中一个中的元素,那么他们查询到的元素都是修改过的元素
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样
newArr = arr ;//将原来数组的地址赋值给新数组
arr[1] = 100; // 10 100 30 40 arr数组
for(int i = 0;i<newArr.length;i++){
System.out.println(newArr[i]+" "); //10 100 30 40 新数组
}
}
}
输出:
注意:任务是将arr的内容复制到newArr中,但是上面代码是数组地址的引用分配,这并不是真正的复制
2.深克隆
深克隆,为了解决浅克隆的问题,引用了for循环来将arr的元素,复制到newArr中。
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样
for(int i= 0;i<newArr.length;i++){ //因为长度一样,所以遍历两个数组都可以
newArr[i] = arr[i]; //将arr的每一个元素赋值给newArr对应的每一个元素
}
//修改arr
arr[1] = 100; // 10 100 30 40 arr数组
//打印arr
for (int j : arr) {
System.out.print(j + " "); //10 100 30 40 arr数组
}
System.out.println();
//打印newArr
for (int j : newArr) {
System.out.print(j + " "); //10 20 30 40 newArr
}
}
}
输出:
结果表示,两个名字并不指向同一个数组地址
3.使用System.ArrayCopy()方法
java的system有一个ArrayCopy的方法可以将一个数组的元素复制到另外一个数组中
方法的原型:
java
public static void arraycopy(
Object src_array ,int src_Pos,Object dest_array,int dest_Pos,int length)
理解:
- Object src_array:要用来复制元素的原数组
- int arc_Pos: 开始复制索引位置
- Object dest_array:目标数组
- int dest_Pos: 要复制的元素在目标数组中的起始索引
- int length: 要复制的数组长度
案例
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr =new int[arr.length]; //创建一个新的数组,长度和原来数组一样
System.arraycopy(arr,0,newArr,0,arr.length);
//修改arr
arr[1] = 100; // 10 100 30 40 arr数组
//打印arr
for (int j : arr) {
System.out.print(j + " "); //10 100 30 40 arr数组
}
System.out.println();
//打印newArr
for (int j : newArr) {
System.out.print(j + " "); //10 20 30 40 newArr
}
}
}
输出:
结果表示System.ArrayCopy()方法是深度克隆
4.使用Arrays.copyOf()方法
copyOf()方法属于Arrays类,是java.util下的一部分,内部采用了arraycopy()。
方法原型:
java
public static int[] copyOf(原数组,要返回的数组长度)
案例
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr = Arrays.copyOf(arr,arr.length);
//修改arr
arr[1] = 100; // 10 100 30 40 arr数组
//打印arr
for (int j : arr) {
System.out.print(j + " "); //10 100 30 40 arr数组
}
System.out.println();
//打印newArr
for (int j : newArr) {
System.out.print(j + " "); //10 20 30 40 newArr
}
}
}
输出:
5.使用Arrays.copyOfRange()方法
和copyOf()一样,内部也是用了arraycopy()。
方法原型:
java
public static int[] copyOfRange(原数组,起始索引,结束索引)
案例:
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr = Arrays.copyOfRange(arr,0,arr.length);
//修改arr
arr[1] = 100; // 10 100 30 40 arr数组
//打印arr
for (int j : arr) {
System.out.print(j + " "); //10 100 30 40 arr数组
}
System.out.println();
//打印newArr
for (int j : newArr) {
System.out.print(j + " "); //10 20 30 40 newArr
}
}
}
输出:
6.使用Object.clone()方法
数组调用.clone()方法达到深克隆效果
java
public class Test01{
public static void main(String [] args){
int [] arr = {10,20,30,40};
int [] newArr = arr.clone();
//修改arr
arr[1] = 100; // 10 100 30 40 arr数组
//打印arr
for (int k : arr) {
System.out.print(k + " "); //10 100 30 40 arr数组
}
System.out.println();
//打印newArr
for (int j : newArr) {
System.out.print(j + " "); //10 20 30 40 newArr
}
}
}
输出: