美文网首页程序员
FastJSON 与克隆

FastJSON 与克隆

作者: 环球探测 | 来源:发表于2016-06-12 19:51 被阅读2024次

阿里巴巴的开源工具包FastJSON在处理JSON数据的时候非常好用,然而我最近实习中使用的时候发现了一处非常容易中招的陷阱:拷贝问题。举例来说:

  • 比如我先有一个Json对象a是这样的
JSONObject a = new JSONObject();
a.put("key1","value1");
  • 然后我需要一个跟a的值一样的新的JSON对象,发现可以直接new
JSONObject b = new JSONObject(a);
  • 然后修改a中的值,发现b的也变了
a.put("key1","value2");
System.out.println(b.getString("key1");
//output : value2

翻阅源码发现,JSONObject是实现了Map接口,里面又有一个存放数据的成员变量map;于是我的new语句是这样实现的:

public JSONObject(Map<String, Object> map){
    this.map = map;
}

这只是把原来对象a的map引用传给了b,两个JSON对象的map是一个东西。
那么,如何实现我想要的结果呢?对了,就是克隆。
JSONObject类实现了cloneable接口的clone方法:

@Override
public Object clone() {
    return new JSONObject(new HashMap<String, Object>(map));
}

可以看出来这里确实是new了一个新HashMap,然后用它new了一个新的JSONObject给我们。所以正确写法:

JSONObject b = (JSONObject)a.clone(); 

多说一句,HashMap内部容器是数组,这里new HashMap(map)是新建一个HashMap,然后将map中的键值对放到了自己的数组中。

相关文章

  • FastJSON 与克隆

    阿里巴巴的开源工具包FastJSON在处理JSON数据的时候非常好用,然而我最近实习中使用的时候发现了一处非常容易...

  • Git:Origin和upstream的区别

    origin 源仓库,一般为git clone的仓库,如bannidaer/fastjson,克隆后默认提交和拉取...

  • Fork方式中origin和upstream的区别

    origin 源仓库,一般为git clone的仓库,如bannidaer/fastjson,克隆后默认提交和拉取...

  • java面试clone相关

    1. 克隆相关知识 1.1. 克隆的分类 克隆分为浅克隆(shallow clone)与深克隆(deep clon...

  • 面试相关

    1.Json解析与XML解析 Gson解析和FastJson ,FastJson解析效率高 XML解析,SAX解析...

  • java克隆

    java克隆 java克隆分为浅克隆和深克隆,概念如下: 浅拷贝(浅克隆)克隆出来的对象的所有变量都含有与原来的对...

  • Java深复制浅复制解析.md

    Java 克隆概念 Java克隆分为深克隆和浅克隆两种类型。 浅复制(浅克隆)被复制对象的所有变量都含有与原来的对...

  • MySQL基本SQL语句之高级操作

    一.克隆表 1.1克隆方法一(将表与内容分开克隆) 1.2克隆方法二(将表与内容一起复制) 二.清空表,删除表内的...

  • 浅克隆与深克隆

    克隆的概念 浅度克隆:原始类型为值传递,对象类型仍为引用传递。深度克隆:所有元素或属性均完全复制,与原对象完全脱离...

  • 深克隆与浅克隆

    一、克隆的作用 快速构建一个和已有对象相同的副本,创建一个新对象,将已有对象的数据导入到新对象里面; 二、克隆基本...

网友评论

    本文标题: FastJSON 与克隆

    本文链接:https://www.haomeiwen.com/subject/gnxldttx.html