`

一种java 克隆实现(二进制)

阅读更多
package com.ben.clone;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Person implements Serializable
{

	private int age;

	private String name;

	private char sex;

	private List sth = new ArrayList();

	private Map bt = new HashMap();

	public int getAge()
	{
		return age;
	}

	public void setAge(int age)
	{
		this.age = age;
	}

	public String getName()
	{
		return name;
	}

	public void setName(String name)
	{
		this.name = name;
	}

	public char getSex()
	{
		return sex;
	}

	public void setSex(char sex)
	{
		this.sex = sex;
	}

	public List getSth()
	{
		return sth;
	}

	public void setSth(List sth)
	{
		this.sth = sth;
	}

	public Map getBt()
	{
		return bt;
	}

	public void setBt(Map bt)
	{
		this.bt = bt;
	}
}

 再写个类实现二进制克隆对象:

 

package com.ben.clone;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.StreamCorruptedException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ByteCloneTest
{
	/**
	 * <pre>
	 * 以二进制方式克隆对象
	 * </pre>
	 * @param src 被克隆的对象
	 * @return 克隆的对象
	 */
	public static final Object byteClone(Object src)
	{
		try
		{
			ByteArrayOutputStream baos = new ByteArrayOutputStream();
			ObjectOutputStream out = new ObjectOutputStream(baos);
			out.writeObject(src);
			out.close();
			ByteArrayInputStream bin = new ByteArrayInputStream(baos.toByteArray());
			ObjectInputStream in = new ObjectInputStream(bin);
			Object clone = in.readObject();
			in.close();
			return (clone);
		}
		catch (ClassNotFoundException e)
		{
			throw new InternalError(e.toString());
		}
		catch (StreamCorruptedException e)
		{
			throw new InternalError(e.toString());
		}
		catch (IOException e)
		{
			throw new InternalError(e.toString());
		}
	}

	public static void main(String[] args)
	{
		Person p = new Person();
		p.setAge(80);
		p.setName("jerry");
		p.setSex('F');
		List list = new ArrayList();
		list.add("apple");
		list.add("orange");
		list.add("banana");
		Map map = new HashMap();
		map.put("哥哥", "liuliu");
		map.put("姐姐", "linlin");
		map.put("李李", "lili");
		p.setBt(map);
		p.setSth(list);
		Person ps = (Person)ByteCloneTest.byteClone(p);
		ps.setName("benlsoft");
		System.out.println("p----"+p.getName());
		System.out.println("ps---"+ps.getName());
	}
}

 发现两个克隆的对象包含的对象都不是引用对象。这样就实现了深度克隆

分享到:
评论

相关推荐

    唯爱交友源码java-nbt:基于GrahamEdgecombe的JNBT库的Java命名二进制标记(NBT)库。NBT是一种基于标签的二进制

    是一种基于标签的二进制格式,旨在携带大量二进制数据和少量附加数据。 入门 源代码 最新和最好的来源可以在这里找到。 如果您使用的是 Git,请使用此命令克隆项目: git clone git://github.com/flow/nbt.git 或者...

    BinVerter:一个开源的二进制到文本、十进制到二进制等的转换器,用 Java 制作

    Java是一种广泛使用的面向对象的编程语言,以其跨平台兼容性和“一次编写,到处运行”的特性而闻名。在Java中开发BinVerter意味着它可以在任何安装了Java运行环境(JRE)的设备上运行,无论操作系统是Windows、MacOS...

    设计模式-克隆模式(讲解及其实现代码)

    此外,由于`clone()`方法是基于二进制流的复制,所以如果对象中包含不可克隆的成员变量(如`final`类型或静态成员),则需要额外处理。 在Java中,深克隆通常需要借助序列化和反序列化来实现。首先将对象序列化成...

    bzs:二进制邮编模拟器

    总的来说,"bzs:二进制邮编模拟器"是一个基于Java的二进制数据压缩工具,它利用无损字典压缩技术来处理二进制数据,实现了高效的数据压缩和解压缩。对于那些处理大量二进制数据的开发者和研究人员来说,这是一款非常...

    java代码-37 李嘉维 十进制转二

    而二进制则是一种基于2的数字系统,只使用两个符号(0和1)。在计算机科学中,所有信息都以二进制形式存储和处理。 要将十进制数转换为二进制,可以采用“除2取余”法,也称为“位移法”。该方法涉及以下步骤: 1....

    一个实用的 Git 开源工具,使用 Scala 编写,用于移除提交到 git 分支上的二进制大文件

    然而,随着项目的推进,有时会遇到二进制大文件的问题,这些文件可能会极大地增加仓库的大小,影响版本控制的效率和速度。针对这一问题,开发者社区推出了一款名为BFG Repo-Cleaner的工具,它是一个轻量级且高效的...

    dipper:北斗七星= Haskell + Hadoop流+二进制+ FlumeJava

    标题中的“dipper”可能是指一个开源项目或者软件工具,它将Haskell、Hadoop流处理、二进制数据处理以及FlumeJava整合在一起,为大数据处理提供了一个独特的解决方案。这个项目的名字可能是受到了水鸟“杓”的启发,...

    java-6个机制.doc

    其次,序列化机制是将对象转换为可持久化的二进制形式,以便在网络间或存储设备间传输。在Java中,要实现对象的序列化,对象所属的类需要实现`Serializable`接口,这个接口没有定义任何方法,它的作用是标记类为可...

    Java基础知识索引

    匿名内部类是内部类的一种特殊形式,它没有名字,通常用于简化代码。 #### 集合框架 - **Collection** - **List**:有序集合,允许重复元素。 - **Set**:无序集合,不允许重复元素。 - **Map**:键值对集合。 ...

    FsServer:Julia 的基于 TCP 的 Erlang 二进制术语服务器

    FsServer 是一个专门为 Julia 编程语言设计的文件服务器,它构建在 TCP 协议基础之上,能够处理 Erlang 二进制术语。这个项目旨在为开发者提供一个高效且灵活的方式来传输和操作文件,特别是在分布式系统或者需要与...

    java——让学员少走弯路

    Java是一种广泛使用的编程语言,由Sun Microsystems开发,其设计目标是具有简单的语法、面向对象、健壮和安全的特性。Java的跨平台能力基于“一次编写,到处运行”的理念,这是通过Java虚拟机(JVM)实现的,JVM允许...

    (完整word版)java6个机制.doc

    序列化是将对象转换为可持久化的二进制形式,以便在网络或设备间传输或存储。在 Java 中,为了实现序列化,一个对象需要实现 `Serializable` 接口,这是一个标记接口,表明对象可以被序列化处理。通过 `...

    干货!资深java工程师面试要点大全 一年来整理资料 Java面试资料 共71页.pdf

    - 类加载是指将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个`java.lang.Class`对象,用来封装类在方法区内的数据结构。 2. **双亲委派模型**: - 这是一种用于...

    clj-odbp:OrientDB二进制协议的Clojure驱动程序

    1. **clojure** - Clojure是一种基于Lisp的函数式编程语言,运行在Java虚拟机上,具有并行计算的优势。 2. **database driver** - 这个标签说明了clj-odbp是一个数据库驱动程序,它的主要功能是作为Clojure应用程序...

    java面试复习资料

    - **实现原理**:Java中的类加载器采用双亲委派模式实现,这是一种递归式的加载方式。 - **优点**:可以保证核心类库不被重复加载,提高了系统的安全性。 - **过程**:当一个类加载器收到加载类的请求时,首先不会...

    【Android】使用Hessian与Java服务端通讯

    在这种情况下,Hessian是一种高效的二进制协议,可以用于创建轻量级的远程过程调用(RPC)服务。本文将详细介绍如何在Android客户端中使用Hessian与Java服务端进行通讯。 **一、Hessian概述** Hessian是由Caucho...

    java面试宝典

    `2 相当于`2 * 8`,这是基于二进制表示的位移操作,效率很高。 **9. 请设计一个一百亿的计算器** 设计一个能够处理一百亿级别的计算器涉及到大数值的运算,可以考虑使用`BigInteger`类来处理。 **10. 使用final...

    wd-nzbget:NZB获取WD MyCloud Home的Usenet二进制下载器

    Usenet是一种全球性的通信网络,用户可以在其中分享文件,尤其是大文件如多媒体内容。 描述中提到,“NZB获取WD MyCloud Home的Usenet二进制下载器”意味着这个项目是将NZBGet的功能扩展到WD MyCloud Home设备上。...

Global site tag (gtag.js) - Google Analytics