深拷贝集合与浅拷贝集合android,关于深拷贝和浅拷贝的理解

一、深拷贝与前拷贝的区别

浅拷贝是拷贝指针,深拷贝是拷贝对象内容。

二、关于遵循NSCopy和NSMutableCopy协议后的copy及mutablCopy区别

1、非集合不可变对象,copy是浅拷贝,mutableCopy是深拷贝;

2、非集合可变对象,copy和mutableCopy是深拷贝;

3、集合不可变对象,copy是浅拷贝,mutableCopy是深拷贝,但集合中的对象还是浅拷贝;

4、集合可变对象,copy和mutableCopy是深拷贝,但集合中的对象均是浅拷贝。

三、如何实现集合中的对象也是深拷贝呢?

1、用 initWithArray:copyItems: 将第二个参数设置为YES即可深复制,如:

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

2、将集合进行归档(archive),然后解档(unarchive),如:

NSArray *trueDeepCopyArray = [NSKeyedUnarchiever unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

学会判断,进行拷贝操作时,被拷贝的是指针还是内容即可。

原文:http://www.cnblogs.com/zhouyi-ios/p/5223973.html

### 如何在 Android Java 中拷贝 `List` #### 使用浅拷贝 对于基本类型的列表或是不需要深拷贝的对象列表,可以直接利用`ArrayList`的构造函数来进行浅层复制: ```java import java.util.ArrayList; import java.util.List; public class ShallowCopyExample { public static void main(String[] args) { List<String> originalList = new ArrayList<>(); originalList.add("Item1"); originalList.add("Item2"); // 利用构造器进行浅拷贝 List<String> copiedList = new ArrayList<>(originalList); System.out.println(copiedList); } } ``` 这种方法适用于对象之间不存在依赖关系的情况,即原始集合中的元素不会因为修改而影响副本中的对应项。 #### 序列化实现深拷贝 当涉及到复杂的数据结构或需要确保完全独立于原数据的新实例时,则应考虑采用序列化的方式来完成深层复制。这里给出一个基于Java内置序列化的例子[^2]: ```java import java.io.*; import java.util.*; class DeepCopyableObject implements Serializable { private String name; // 构造方法、getter/setter省略... } public class DeepCopyExample { @SuppressWarnings("unchecked") public static <T extends Serializable> T deepClone(T obj) throws IOException, ClassNotFoundException { ByteArrayOutputStream bos = new ByteArrayOutputStream(); ObjectOutputStream out = null; ObjectInputStream in = null; try { out = new ObjectOutputStream(bos); out.writeObject(obj); // 将对象写入字节流 ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray()); in = new ObjectInputStream(bis); return (T)in.readObject(); // 读取并返回新的克隆体 } finally { if(out != null){ out.close(); } if(in != null){ in.close(); } } } public static void main(String[] args) throws Exception{ List<DeepCopyableObject> listOriginal = Arrays.asList( new DeepCopyableObject(), new DeepCopyableObject() ); // 执行深拷贝操作 List<DeepCopyableObject> clonedList = deepClone(listOriginal); System.out.println(clonedList.equals(listOriginal)); } } ``` 此代码片段展示了如何通过序列化技术创建给定对象的一个全新且独立的副本来达到深拷贝的效果。 #### 高效文件级复制(针对大容量数据) 如果待处理的是大量数据或者是较大的二进制资源文件,在某些情况下可能更适合直接使用更高效的API如`Files.copy()` 或者其他高级IO工具来代替逐个元素遍历的方式[^4]: ```java Path source = Paths.get("/path/to/source/file"); Path target = Paths.get("/path/to/target/file"); // 复制单个文件至另一位置 Files.copy(source, target, StandardCopyOption.REPLACE_EXISTING); ``` 上述三种方案分别适合不同场景下的需求,开发者可以根据具体的应用环境个人偏好选择最合适的一种方式进行列表或其他类型容器的内容复制工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值