javalist复制:浅拷贝与深拷贝
在Java中,有时候我们需要复制一个List对象,这时候就需要考虑到复制的方式。一般来说,复制方式分为浅拷贝和深拷贝。
浅拷贝
浅拷贝是指将一个对象复制到一个新的对象中,但是这两个对象中的元素是共享的,即对一个对象进行修改会影响到另一个对象。在Java中,List的clone方法就是浅拷贝。
可以看下面的例子:
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = (ArrayList)list1.clone();
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
list2.add(4);
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
运行结果为:
list1: [1, 2, 3]
list2: [1, 2, 3]
list1: [1, 2, 3, 4]
list2: [1, 2, 3, 4]
我们可以看到,list2添加了一个元素4,但是list1也跟着改变了。这就是浅拷贝的特点。
深拷贝
深拷贝是指将原始对象完全复制一份,即复制后的对象和原始对象没有任何关系。在Java中,我们可以通过序列化和反序列化来实现深拷贝。
可以看下面的例子:
List<Integer> list1 = new ArrayList<>();
list1.add(1);
list1.add(2);
list1.add(3);
List<Integer> list2 = new ArrayList<>();
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos1 = new ObjectOutputStream(baos);
oos1.writeObject(list1);
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
list2 = (ArrayList<Integer>) ois.readObject();
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
list2.add(4);
System.out.println("list1: " + list1);
System.out.println("list2: " + list2);
运行结果为:
list1: [1, 2, 3]
list2: [1, 2, 3]
list1: [1, 2, 3]
list2: [1, 2, 3, 4]
我们可以看到,list2添加一个元素4,但是list1没有变化,这就是深拷贝的特点。
小结
在实际开发中,我们需要根据实际情况来选择使用哪种方式进行复制。如果我们需要两个对象的元素共享,那么使用浅拷贝;如果我们需要复制后的对象和原始对象没有任何关系,那么使用深拷贝。由于List的clone方法是浅拷贝,如果我们需要进行深拷贝,我们可以使用序列化和反序列化。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:javalist复制:浅拷贝与深拷贝 - Python技术站