System.arraycopy()和Arrays.copyOf()是深拷贝or浅拷贝
基本类型:
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)
总结:
Arrays.copyOf(T[] orignial,int newLength)和System.arraycopy(Object src,int srcPos,Object dest,int destPos,int length)
相对于数组而言,都是创建了一个新的数组,是深拷贝;
相对于数组元素而言,当数组为一维数组,并且元素是基本类型、String、包装类型时都是深拷贝,其他类型是浅拷贝。
欢迎关注我的博客,获取更多精品知识合集
如果觉得对您有帮助的话,请帮我点赞、分享!您的支持是我不竭的创作动力!
欢迎关注我的公众号,获取更多技术知识分享