new JSONObject(original) 是浅拷贝

[复制链接]
发表于 2026-1-20 19:05:58 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表