copy与deepcopy_java clone 深拷贝

copy与deepcopy_java clone 深拷贝说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA深层拷贝DeepCopy的使用方式。方法实现很简单,提供两种方式:一种是序列化成数据流,前提是所有对象(对象中包含的对象…)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以用第二种方式。第二种是将对象序…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

说到复制方法,在开发程序中要怎么复制呢?其实复制Java数组的方法很多,但大多数都是浅层复制,今天爱站技术频道小编带你寻找详解JAVA 深层拷贝 DeepCopy的使用方式。

方法实现很简单,提供两种方式:

一种是序列化成数据流,前提是所有对象(对象中包含的对象…)都需要继承Serializable接口,如果都继承了那很容易,如果没有继承,而且也不打算修改所有类,可以用第二种方式。

第二种是将对象序列化为json,通过json来实现拷贝,这种方式需要用到net.sf.json.JSONObject。

具体代码如下:

public class DeepCopy {

/**

* 深层拷贝

*

* @param

* @param obj

* @return

* @throws Exception

*/

public static T copy(T obj) throws Exception {

//是否实现了序列化接口,即使该类实现了,他拥有的对象未必也有…

if(Serializable.class.isAssignableFrom(obj.getClass())){

//如果子类没有继承该接口,这一步会报错

try {

return copyImplSerializable(obj);

} catch (Exception e) {

//这里不处理,会运行到下面的尝试json

}

}

//如果序列化失败,尝试json序列化方式

if(hasJson()){

try {

return copyByJson(obj);

} catch (Exception e) {

//这里不处理,下面返回null

}

}

return null;

}

/**

* 深层拷贝 – 需要类继承序列化接口

* @param

* @param obj

* @return

* @throws Exception

*/

@SuppressWarnings(“unchecked”)

public static T copyImplSerializable(T obj) throws Exception {

ByteArrayOutputStream baos = null;

ObjectOutputStream oos = null;

ByteArrayInputStream bais = null;

ObjectInputStream ois = null;

Object o = null;

//如果子类没有继承该接口,这一步会报错

try {

baos = new ByteArrayOutputStream();

oos = new ObjectOutputStream(baos);

oos.writeObject(obj);

bais = new ByteArrayInputStream(baos.toByteArray());

ois = new ObjectInputStream(bais);

o = ois.readObject();

return (T) o;

} catch (Exception e) {

throw new Exception(“对象中包含没有继承序列化的对象”);

} finally{

try {

baos.close();

oos.close();

bais.close();

ois.close();

} catch (Exception e2) {

//这里报错不需要处理

}

}

}

/**

* 是否可以使用json

* @return

*/

private static boolean hasJson(){

try {

Class.forName(“net.sf.json.JSONObject”);

return true;

} catch (Exception e) {

return false;

}

}

/**

* 深层拷贝 – 需要net.sf.json.JSONObject

* @param

* @param obj

* @return

* @throws Exception

*/

@SuppressWarnings(“unchecked”)

public static T copyByJson(T obj) throws Exception {

return (T)JSONObject.toBean(JSONObject.fromObject(obj),obj.getClass());

}

}

只需要调用copy方法就行。

以上是爱站技术频道小编分享给大家的详解JAVA 深层拷贝 DeepCopy的使用方式,希望本文能帮助到有需要的朋友们。请大家继续关注我们,我们会给大家带来更多的知识。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/186717.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • QThread介绍

    QThread介绍在程序设计中,为了不影响主程序的执行,常常把耗时操作放到一个单独的线程中执行。Qt对多线程操作有着完整的支持,Qt中通过继承QThread并重写run()方法的方式实现多线程代码的编写。针对线程之间的同步与互斥问题,Qt还提供了QMutex、QReadWriteLock、QwaitCondition、QSemaphore等多个类来实现。本篇博客将针对以下几个方面进行讲解[1]QThread的常用接口以及QThread的实现[2]QThread的信号事件[3]QThread执行完后自动释放内存

    2022年5月28日
    119
  • jboss安装与配置_JbusDriver

    jboss安装与配置_JbusDriver1,下载jboss6.0产品jboss官网下载地址:http://www.jboss.org/jbossas/downloads/这里下载了jboss-as-distribution-6.0.0.Final.zip下载完成后,将其解压缩后即可完成安装,解压缩后将其放置到一个不带空格的目录(避免不必要的麻烦),同时在“环境变量设置”中设置名为JBOSS_HOME的环境变量,值为J…

    2022年9月28日
    4
  • java二维数组查找

    java二维数组查找问题:在一个二维数组中,每行每列都递增排序,在这个数组中查找一个数字,如果存在返回true,否则返回flase。分析:数组查找一直都是初学java的同学的热门考点,关于查找主要有顺序查找、二分查找、哈希表查找、二叉排序树查找。我们看下下面这个数组,数组满足每行每列都是递增顺序。在这个数组中查找某个数,如果存在,返回true和所在位置。否则返回flase。这里我们该选择什么样的方式来…

    2022年5月30日
    29
  • 【Javascript】【WebRTC】WebRTC从原理到实现(四):ICE服务器

    【Javascript】【WebRTC】WebRTC从原理到实现(四):ICE服务器ICE全称InteractiveConnectivityEstablishment,翻译成中文就是“交互式连通建立方式”它通过综合利用现有STUN,TURN等协议,有效地穿透各种NAT,以更有效的方式来建立会话…

    2022年5月2日
    41
  • django views_django admin视图

    django views_django admin视图前言ViewSet只是一种基于类的视图,它不提供任何方法处理程序(如.get()或.post()),而是提供诸如.list()和.create()之类的操作。ViewSet的方法处理程序

    2022年7月31日
    4
  • ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    ubuntu常见问题指南 新手发问前必看 08/03/27 更新

    2021年8月7日
    64

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号