Java的Clone简要

对于一个普通的对象来说,如果实现Cloneable接口,并重写clone方法可以实现对象的深拷贝。

但是对于List/Set等集合来说不管是用集合的clone方法还是对象的clone方法都是浅拷贝,即指针的引用,如果要实现java集合的深拷贝必须将对象实现Serializable接口后写一个深拷贝方法才行。

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class test {
    public static void main(String[] args) {
        List<Human> sdf = new ArrayList<Human>();
        sdf.add(new Human("sdf1", 100));
        sdf.add(new Human("sdf2", 200));

        List<Human> h3c = null;
        try {
            h3c = deepCopy(sdf);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        Human h1 = h3c.get(0);
        h1.name = "h3c";

        System.out.println(sdf.get(0).name + "-" + sdf.get(0).age);
        System.out.println(h3c.get(0).name + "-" + h3c.get(0).age);
    }

    static class Human implements Serializable {
        String name;
        int age;

        public Human(String n, int a) {
            this.name = n;
            this.age = a;
        }

    }

    //关键代码 执行序列化和反序列化  进行深度拷贝
    public static <T> List<T> deepCopy(List<T> src) throws IOException, ClassNotFoundException {
        ByteArrayOutputStream byteOut = new ByteArrayOutputStream();
        ObjectOutputStream out = new ObjectOutputStream(byteOut);
        out.writeObject(src);  

        ByteArrayInputStream byteIn = new ByteArrayInputStream(byteOut.toByteArray());
        ObjectInputStream in = new ObjectInputStream(byteIn);
        @SuppressWarnings("unchecked")
        List<T> dest = (List<T>) in.readObject();
        return dest;
    }
}
时间: 2024-08-08 17:57:40

Java的Clone简要的相关文章

详解java中clone方法

原文地址:http://leihuang.net/2014/11/14/java-clone/ In java, it essentially means the ability to create an object with similar state as the original object. 什么是clone 字典中的意思就是复制(强调跟原来的一模一样). *By default, java cloning is 'field by field copy' *.因为Object类不知

java 深克隆clone对象或容器的另一种方法

本页地址:http://blog.csdn.net/lpy3654321/article/details/43054557 java 深clone对象的另一种方法 public static <T> T deepCopy(T src) throws IOException, ClassNotFoundException{ ByteArrayOutputStream byteOut = new ByteArrayOutputStream(); ObjectOutputStream out = n

Java中clone方法的使用

什么是clone 在实际编程过程中,我们常常要遇到这种情况:有一个对象object1,在某一时刻object1中已经包含了一些有效值,此时可能会需要一个和object1完全相同新对象object2,并且此后对object2任何改动都不会影响到object1中的值,也就是说,object1与object2是两个独立的对象,但object2的初始值是由object1对象确定的.在Java语言中,用简单的赋值语句是不能满足这种需 求的.要满足这种需求虽然有很多途径,但实现clone()方法是其中最简单

Java - deep clone

先让我描述一下问题:我在某Action(struts2.x)-A中写了一个功能P,以当前用户的某个标识F == 1时需要走这个功能,而且这个功能因某些原因已经侵入到了其他一些method中.顺便一提,A中获得当前用户session的method已经被父类封装好了.然后我的代码已经push上去了,第二天有人告诉我能不能暂时去掉这个功能.一个个注释掉太麻烦了,于是我决定在这个A中override获得当前用户session的method,并将F赋值为0. 于是我只需要来个shallow copy就可以

浅析java中clone()方法

本文转载自:http://blog.csdn.net/mengxiangyue/article/details/6818611 Java中我们可能都遇到过这样的情况,在我们将一个对象做为参数传给一个函数的时候,我们希望在这个函数中所做的操做,并不会影响到这个对象本身.但是在java传递都是引用,所以往往我们在函数内部改变了对象的某一个值,在函数外面调用该对象的时候,相应的值也同样被改变了,例如下面的程序: class Test { static void myMethod(Point pt1)

java的clone

java的浅克隆,十分简单.但是只会克隆基本的数据类型,当涉及到引用类型时就不好用了. public class Employee implements Cloneable {  private String name;  private String gender;  public String getName() {   return name;  }  public void setName(String name) {   this.name = name;  }  public Str

关于Java深clone 的例子学习

之前http://www.cnblogs.com/lhppom/p/4857702.html里有提到关于Java的深克隆的学习,深浅区别就是在于仅复制对象引用和复制对象引用所指向的对象,最近在看<Java核心技术卷1>时,看到其中一个克隆的例子,这里再做个补充,其实现克隆的方式就是将对象中除数值或基本类以外的域再进行克隆,然后将引用给到新克隆的对象中所对应的域: 1 public class Pet implements Cloneable{ 2 String name; 3 4 public

java的clone方法

最近在写 hugenumber 类中自乘方法的时候遇到了一点问题.发现问题出在未对对象进行克隆上. 以下是关于克隆总结的几点: ----------------------------------------分割线-------------------------------- Java语言的一个优点就是取消了指针的概念,但也导致了许多程序员在编程中常常忽略了对象与引用 的区别,特别是先学c.c++后学java的程序员.并且由于Java不能通过简单的赋值来解决对象复制 的问题,在开发过程中,也常

Java的clone()用法实例解析

1.背景 用java写程序的时候很苦恼的一件事就是,如果将一个对象a赋给另一个对象b,那么你改变a的变量值得时候,b的值也对应的变化.如果我们只想单纯的获取那个时刻的a的状况给b的话,就要用到clone方法了. 比如说如下代码: public class Main { public static void main(String[] args) { // TODO Auto-generated method stub Node n=new Node(); Node n1=n; n.a=5; Sy