📅  最后修改于: 2023-12-03 15:37:50.799000             🧑  作者: Mango
在开发过程中,经常需要复制Java集合对象以便于修改操作,而直接复制对象并不是一种好的选择,因为这样复制只是复制了对象的引用。在修改其中一个集合时,另一个集合也会受到影响。因此,复制Java集合需要使用特殊的方法。
在复制Java集合之前,我们需要了解两种不同的复制方式:浅拷贝和深拷贝。浅拷贝只复制对象的引用,不复制对象本身,而深拷贝则复制对象本身。因此,深拷贝通常需要更多的时间和内存。
浅拷贝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());
深拷贝List可以使用序列化和反序列化,或者使用第三方库进行拷贝。
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();
使用第三方库CopyUtils进行深拷贝:
List<Integer> originalList = new ArrayList<>();
originalList.add(1);
originalList.add(2);
List<Integer> deepCopy = (List<Integer>) CopyUtils.deepCopy(originalList);
浅拷贝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);
深拷贝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());
}
浅拷贝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);
深拷贝Set需要使用第三方库进行拷贝。
Set<Integer> originalSet = new HashSet<>();
originalSet.add(1);
originalSet.add(2);
Set<Integer> deepCopy = new HashSet<>(CopyUtils.deepCopy(originalSet));
本文介绍了复制Java集合的各种方法,包括浅拷贝和深拷贝。使用合适的方法可以避免修改源集合时导致副本也受到影响的问题。需要注意的是,深拷贝需要更多的时间和内存,因此应该根据实际需求进行选择。