先说结论:
(1)Arrays.copyOf(T[] orignial,int newLength)和System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
当数组为一维数组,并且元素是基本类型、String、包装类型时都是深拷贝,此时复制之后的数组与原数组没有任何关系,修改两个数组中任意一个都不会对另外一个产生影响;元素是其他类型时是浅拷贝。
(2)当复制的数组是多维数组或者元素为对象的一维数组时,副本数组的元素一旦被修改,原数组的元素也会被同步修改,此时数组中的元素实际在堆中只有一份,但是每个元素都有两个引用(也就是说原数组和副本数组引用的是同一个对象),此时是浅拷贝。
基本类型:
Object[] src = new Object[]{12, 23, 45};
Object[] arraysCopyOf = Arrays.copyOf(src, 3);
Object[] systemArrayCopy = new Object[3];
System.arraycopy(src, 0, systemArrayCopy, 0, 3);
System.out.println("----修改数组[0]的值前----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
src[0] = 121;
System.out.println("----修改数组[0]的值后----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
输出结果:
----修改数组[0]的值前----
原来数组[0]的值–>12
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
----修改数组[0]的值后----
原来数组[0]的值–>121
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
String类型:
Object[] src = new Object[]{"12", "23", "45"};
Object[] arraysCopyOf = Arrays.copyOf(src, 3);
Object[] systemArrayCopy = new Object[3];
System.arraycopy(src, 0, systemArrayCopy, 0, 3);
System.out.println("----修改数组[0]的值前----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
src[0] = "121";
System.out.println("----修改数组[0]的值后----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
输出结果:
----修改数组[0]的值前----
原来数组[0]的值–>12
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
----修改数组[0]的值后----
原来数组[0]的值–>121
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
包装类型:
Object[] src = new Object[]{
new Integer(12),
new Integer(23),
new Integer(45)
};
Object[] arraysCopyOf = Arrays.copyOf(src, 3);
Object[] systemArrayCopy = new Object[3];
System.arraycopy(src, 0, systemArrayCopy, 0, 3);
System.out.println("----修改数组[0]的值前----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
src[0] = new Integer(121);
System.out.println("----修改数组[0]的值后----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
输出结果:
----修改数组[0]的值前----
原来数组[0]的值–>12
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
----修改数组[0]的值后----
原来数组[0]的值–>121
arraysCopyOf数组[0]的值–>12
systemArrayCopy数组[0]的值–>12
其他类型:
Object[] src = new Object[]{
User.builder().name("张三").age(21).build(),
User.builder().name("张三1").age(22).build(),
User.builder().name("张三2").age(23).build()
};
Object[] arraysCopyOf = Arrays.copyOf(src, 3);
Object[] systemArrayCopy = new Object[3];
System.arraycopy(src, 0, systemArrayCopy, 0, 3);
System.out.println("----修改数组[0]的值前----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->" + systemArrayCopy[0]);
User user = (User) src[0];
user.setName("张三三");
user.setAge(211);
System.out.println("----修改数组[0]的值后----");
System.out.println("原来数组[0]的值-->" + src[0]);
System.out.println("arraysCopyOf数组[0]的值-->" + arraysCopyOf[0]);
System.out.println("systemArrayCopy数组[0]的值-->"+systemArrayCopy[0]);
@Data
@Builder
class User {
private String name;
private Integer age;
}
输出结果:
----修改数组[0]的值前----
原来数组[0]的值–>User(name=张三, age=21)
arraysCopyOf数组[0]的值–>User(name=张三, age=21)
systemArrayCopy数组[0]的值–>User(name=张三, age=21)
----修改数组[0]的值后----
原来数组[0]的值–>User(name=张三三, age=211)
arraysCopyOf数组[0]的值–>User(name=张三三, age=211)
systemArrayCopy数组[0]的值–>User(name=张三三, age=211)
多维数组或者元素为对象的一维数组
public static void main(String[] args) {
int[] a={1,2,3};
int[] b={4,5,6};
int[][] sum= {a,b};
int[][] copy= new int[2][3];
System.arraycopy(sum,0,copy,0,sum.length);
//修改副本数组
copy[0][0]=1;
copy[0][1]=1;
copy[0][2]=1;
//查看原数组是否发生改变
for (int i : a) {
System.out.println(i);
}
}
输出结果
1
1
1