博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android 中对Java对象深拷贝的方法
阅读量:2084 次
发布时间:2019-04-29

本文共 2148 字,大约阅读时间需要 7 分钟。

前言

在项目中偶尔会遇到关于深拷贝的问题,比如点餐列表中的点一个饮料,它有多种规格(常温、冰),这样放到购物车列表中就可能出现2个相同id的饮料。

如下图所示,其中我要对百事可乐进行拷贝一份,然后各修改它的属性值为常温/加冰。


 

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

在Java语言中需要拷贝一个对象时,有两种类型:浅拷贝与深拷贝。

  • 浅拷贝:只是拷贝了源对象的地址,所以源对象的值发生变化时,拷贝对象的值也会发生变化。

  • 深拷贝:只是拷贝了源对象的值,所以即使源对象的值发生变化时,拷贝对象的值也不会改变。

浅拷贝示例: 

public class Food {    String name;    String type;    public Food(String name,String type){        this.name = name;        this.type = type;    }  }
public void main(){    Food food1 =new Food();    food.name ="百事可乐";    food.type = "冰";    //拷贝    Food food2 =food;    food.type= "常温";}

结果:food1和food2的 type都为“常温”。

 

接下来,我们来看看深拷贝的方法。


二、深拷贝的方法


(1)构造函数

通过在调用构造函数进行深拷贝,形参如果是基本类型和字符串则直接赋值,如果是对象则重新new一个。

public void main(){    Food food1 =new Food("百事可乐","冰");    //拷贝    Food food2 =new Food(food1.name,"常温");}

(2)重写clone()

public class Food implements Cloneable {    private String name;    private String type;     // constructors,get,set     @Override    public User clone() throws CloneNotSupportedException {        Food food = (Food) super.clone();        user.setType(this.type.clone());        return food;    }}public void main(){    Food food1 = new Food("百事可乐", "冰");     // 调用clone()方法进行深拷贝    Food food2 = food1.clone();}

(3)Apache Commons Lang序列化

Java提供了序列化的能力,可以先将源对象进行序列化,再反序列化生成拷贝对象。但是,使用序列化的前提是拷贝的类需要实现Serializable接口。Apache Commons Lang包对Java序列化进行了封装,我们可以直接使用它。

public class Food implement Serializable{    String name;    String type;    //..}public void mian(){    // 使用Apache Commons Lang序列化进行深拷贝    Food food2 = (Food) SerializationUtils.clone(food1);    // 修改源对象的值}

(4)Gson序列化

Gson可以将对象序列化成JSON,也可以将JSON反序列化成对象,所以我们可以用它进行深拷贝。

public void main(){    Food food1 =new Food("百事可乐","冰");    //拷贝    Gson gson = new Gson();    Food food2 =gson.fromJson(gson.toJson(food1), Food.class);    food2.setType("常温");}

(5)Jackson序列化

Jackson与Gson相似,可以将对象序列化成JSON。不过拷贝的类需要有默认的无参构造函数。

public void main(){    Food food1 =new Food("百事可乐","冰");    //拷贝    ObjectMapper objectMapper = new ObjectMapper();    Food food2 =objectMapper.readValue(objectMapper.writeValueAsString(food1), Food.class));    food2.setType("常温");}

小结:

个人项目中使用的是Gson实现的对象序列化深拷贝方法。

原因是集成Gson已然是项目中标配,而且使用起来简洁,代码熟悉感很强。


参考链接:

 

转载地址:http://syiqf.baihongyu.com/

你可能感兴趣的文章
数据类型 java转换
查看>>
"NetworkError: 400 Bad Request - http://172.16.47.117:8088/rhip/**/####t/approval?date=976
查看>>
mybatis 根据 数据库表 自动生成 实体
查看>>
C结构体、C++结构体、C++类的区别
查看>>
进程和线程的概念、区别和联系
查看>>
CMake 入门实战
查看>>
绑定CPU逻辑核心的利器——taskset
查看>>
Linux下perf性能测试火焰图只显示函数地址不显示函数名的问题
查看>>
c结构体、c++结构体和c++类的区别以及错误纠正
查看>>
Linux下查看根目录各文件内存占用情况
查看>>
A星算法详解(个人认为最详细,最通俗易懂的一个版本)
查看>>
利用栈实现DFS
查看>>
(PAT 1019) General Palindromic Number (进制转换)
查看>>
(PAT 1073) Scientific Notation (字符串模拟题)
查看>>
(PAT 1080) Graduate Admission (排序)
查看>>
Play on Words UVA - 10129 (欧拉路径)
查看>>
mininet+floodlight搭建sdn环境并创建简答topo
查看>>
【linux】nohup和&的作用
查看>>
Set、WeakSet、Map以及WeakMap结构基本知识点
查看>>
【NLP学习笔记】(一)Gensim基本使用方法
查看>>