📜  复制集合java(1)

📅  最后修改于: 2023-12-03 15:37:50.799000             🧑  作者: Mango

复制集合Java

在开发过程中,经常需要复制Java集合对象以便于修改操作,而直接复制对象并不是一种好的选择,因为这样复制只是复制了对象的引用。在修改其中一个集合时,另一个集合也会受到影响。因此,复制Java集合需要使用特殊的方法。

1. 浅拷贝和深拷贝

在复制Java集合之前,我们需要了解两种不同的复制方式:浅拷贝和深拷贝。浅拷贝只复制对象的引用,不复制对象本身,而深拷贝则复制对象本身。因此,深拷贝通常需要更多的时间和内存。

2. 复制List
2.1 浅拷贝List

浅拷贝List可以使用List的构造方法或subList方法。

List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);

// 使用List的构造方法
List<Integer> shallowCopy = new ArrayList<>(originalList);

// 使用subList方法
List<Integer> shallowCopy2 = originalList.subList(0, originalList.size());
2.2 深拷贝List

深拷贝List可以使用序列化和反序列化,或者使用第三方库进行拷贝。

2.2.1 使用序列化和反序列化

List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);

// 将原始集合序列化成字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(originalList);

// 反序列化字节数组生成新的集合
ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);
List<Integer> deepCopy = (List<Integer>) ois.readObject();

2.2.2 使用第三方库

使用第三方库CopyUtils进行深拷贝:

List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);

List<Integer> deepCopy = (List<Integer>) CopyUtils.deepCopy(originalList);
3. 复制Map
3.1 浅拷贝Map

浅拷贝Map可以使用Map的构造方法或putAll方法。

Map<Integer, String> originalMap = new HashMap<>();
originalMap.put(1, "one");
originalMap.put(2, "two");

// 使用Map的构造方法
Map<Integer, String> shallowCopy = new HashMap<>(originalMap);

// 使用putAll方法
Map<Integer, String> shallowCopy2 = new HashMap<>();
shallowCopy2.putAll(originalMap);
3.2 深拷贝Map

深拷贝Map需要遍历源Map,然后逐个复制每一个键值对。

Map<Integer, String> originalMap = new HashMap<>();
originalMap.put(1, "one");
originalMap.put(2, "two");

// 遍历源Map进行复制
Map<Integer, String> deepCopy = new HashMap<>();
for (Map.Entry<Integer, String> entry : originalMap.entrySet()) {
    deepCopy.put(entry.getKey(), entry.getValue());
}
4. 复制Set
4.1 浅拷贝Set

浅拷贝Set可以使用Set的构造方法或addAll方法。

Set<Integer> originalSet = new HashSet<>();
originalSet.add(1);
originalSet.add(2);

// 使用Set的构造方法
Set<Integer> shallowCopy = new HashSet<>(originalSet);

// 使用addAll方法
Set<Integer> shallowCopy2 = new HashSet<>();
shallowCopy2.addAll(originalSet);
4.2 深拷贝Set

深拷贝Set需要使用第三方库进行拷贝。

Set<Integer> originalSet = new HashSet<>();
originalSet.add(1);
originalSet.add(2);

Set<Integer> deepCopy = new HashSet<>(CopyUtils.deepCopy(originalSet));
5. 总结

本文介绍了复制Java集合的各种方法,包括浅拷贝和深拷贝。使用合适的方法可以避免修改源集合时导致副本也受到影响的问题。需要注意的是,深拷贝需要更多的时间和内存,因此应该根据实际需求进行选择。