马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
迩来做一个功能的时间,想复制一个 JSONObject 里的全部属性,就直接利用的 new JSONObject(original),之后对新new的和老的 JSONObject 举行了一些操纵,然后落库,发现落库的数据总是有标题,怪怪的。末了发现 new JSONObject(original) 出来的JSONObject和老的JSONObject是 共享 的属性。故此记载一下。
我这里利用的是 alibaba 的 com.alibaba.fastjson.JSONObject。
我们先说说什么是 深拷贝?什么是 浅拷贝?
深拷贝:深拷贝是指创建一个新的对象,并递归地复制原始对象中的全部引用范例数据布局,包罗内部的对象。深拷贝后的对象与原始对象 完全独立,对此中一个对象的修改 不会影响 另一个对象。
浅拷贝:浅拷贝是指创建一个新的对象,该对象的内容是原始对象的副本。假如原始对象中包罗了引用范例的数据布局(如列表、字典等),浅拷贝只会复制这些引用,而不会复制引用指向的对象本身。因此,原始对象和浅拷贝后的对象会 共享 一些内部对象的引用,修改此中一个对象的共享部门 大概会影响 另一个对象。(这个知识点,我在之前的博文里提及过了,本身用的时间也搞忘了)
浅拷贝 —— 修改新 JSONObject,原对象也会被修改:- public static void main(String[] args) {
- // 原始对象
- JSONObject original = new JSONObject();
- original.put("name", "张三");
- // 原始对象中的嵌套对象
- JSONObject address = new JSONObject();
- address.put("city", "北京");
- address.put("street", "长安街");
- original.put("address", address);
- // 使用构造函数"拷贝"
- JSONObject copy = new JSONObject(original);
- copy.put("name", "李四");
- // 修改浅拷贝后对象的嵌套内容
- copy.getJSONObject("address").put("city", "上海");
- System.out.println("原始对象: " + original);
- System.out.println("拷贝对象: " + copy);
- System.out.println("address是否同一个对象: " + (original.get("address") == copy.get("address")));
- // 输出结果:
- // 原始对象: {"address":{"city":"上海","street":"长安街"},"name":"李四"}
- // 拷贝对象: {"address":{"city":"上海","street":"长安街"},"name":"李四"}
- // address是否同一个对象: true (证明是浅拷贝)
- }
复制代码 厥后我调解了代码,利用 序列化 来实现深拷贝:- public static void main(String[] args) {
- // 原始对象
- JSONObject original = new JSONObject();
- original.put("name", "张三");
- // 原始对象中的嵌套对象
- JSONObject address = new JSONObject();
- address.put("city", "北京");
- address.put("street", "长安街");
- original.put("address", address);
- // 深拷贝:先序列化为JSON字符串,再反序列化为新对象
- String jsonStr = original.toJSONString();
- JSONObject deepCopy = JSONObject.parseObject(jsonStr);
- deepCopy.put("name", "李四");
- // 修改深拷贝后的子对象
- deepCopy.getJSONObject("address").put("city", "上海");
- System.out.println("原始对象: " + original);
- System.out.println("拷贝对象: " + deepCopy);
- System.out.println("address是否同一个对象: " + (original.get("address") == deepCopy.get("address")));
- // 输出结果:
- // 原始对象: {"address":{"city":"北京","street":"长安街"},"name":"张三"}
- // 拷贝对象: {"address":{"city":"上海","street":"长安街"},"name":"李四"}
- // address是否同一个对象: false (证明是深拷贝)
- }
复制代码 当我们在上下文中利用JSON对象时,总是假设须要深拷贝,除非我们能明白利用浅拷贝是符合需求,跟我们想要的效果是划一的。
业精于勤荒于嬉,行成于思毁于随。-- 烟沙九洲
|