「深度复制java」深度复制用什么包

博主:adminadmin 2022-12-03 09:57:08 72

今天给各位分享深度复制java的知识,其中也会对深度复制用什么包进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

java 深度复制

House不是单例吧?h1和h2的地址不一样第一个肯定是false.house内部怎么样这个光看这些真难看出。

Java中如何通过序列化进行深层复制

先创建两个类,一个学生类和一个课程类(两个类都要实现Serializable接口才能被序列化),学生类有一个属性为课程。

import java.io.Serializable;

/**

 * 课程类

 */

public class Course implements Serializable {

    private String name;

    public Course(String name) {

        this.name = name;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

}

import java.io.Serializable;

/**

 * 学生类

 */

public class Student implements Serializable {

    // 学号

    private int id;

    // 姓名

    private String name;

    // 课程

    private Course course;

    public Student() {

    }

    public Student(int id, String name, Course course) {

        this.id = id;

        this.name = name;

        this.course = course;

    }

    public int getId() {

        return id;

    }

    public void setId(int id) {

        this.id = id;

    }

    public String getName() {

        return name;

    }

    public void setName(String name) {

        this.name = name;

    }

    public Course getCourse() {

        return course;

    }

    public void setCourse(Course course) {

        this.course = course;

    }

}

对象复制:

import java.io.*;

public class ObjectCopy {

    public static void main(String[] args) {

        Course course = new Course("java程序设计");

        Student stu = new Student(1, "jack", course);

        System.out.println("原对象hashcode:" + stu.hashCode());

        try {

            // 序列化

            ByteArrayOutputStream baos = new ByteArrayOutputStream();

            ObjectOutputStream oos = new ObjectOutputStream(baos);

            oos.writeObject(stu);

            // 反序列化

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

            ObjectInputStream ois = new ObjectInputStream(bais);

            // 复制后的对象

            Student copy = (Student) ois.readObject();

            System.out.println("新对象hashcode:" + copy.hashCode());

            System.out.println(copy.getCourse().getName());

        } catch (IOException e) {

            e.printStackTrace();

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

}

java如何深度copy一个object?

java本身好像没有提供这个方法的吧,只有你自己重新创建一个对象,然后赋值给这个对象。

iamge的复制可以用BufferedImage的方法:

public WritableRaster copyData(WritableRaster outRaster)计算 BufferedImage 的一个任意矩形区域,并将其复制到指定的 WritableRaster。要计算的区域由指定 WritableRaster 的边界确定。指定 WritableRaster 必须具有与此图像兼容的 SampleModel。如果 outRaster 为 null,则创建一个合适的 WritableRaster。

不过还有一个简单的办法,就是创建一个一样大小和一样类型的BufferedImage,然后把要复制的图画上去,这两个图片就是一样的了。

JAVA如何实现深拷贝

下面给你简单介绍protected 域(或方法)实现过程思路:

protected 域(或方法)对本包内的所有类可见(当然包括子类),那么,子类可以获得访超类受保护域(或方法)的权利,但是,若子类和超类不在同一个包下,就不能访问超类对象的这个受保护域(或方法)。

浅拷贝与深拷贝

Object类对自己的具体子类的域一无所知,Object类的clone方法只是将各个域进行拷贝。数值或基本类型不会出现问题,但是,如果在对象中包含了引用对象,这些对象的内容没有被自我复制,拷贝的结果也即是原始对象和拷贝对象引用着同一个引用对象(一般地,动词“引用”可理解为“管理”,就是指向同一内存)。

浅拷贝满足:

x.clone() != x为 true,

x.clone().getClass() == x.getClass()为true,

((x.clone().field1 ) == (x. field1)) … ((x.clone().fieldN )==(x. fieldN))也为 true 。

如果原始对象与浅拷贝对象共同引用(管理、指向)的引用对象是不可变的,将不会产生任何问题

如果原始对象管理的引用对象是可变的,就必须需重新定义clone方法,来实现深层次的拷贝。要对涉及的每一个类,判断以下两点:

默认的clone方法是否满足需求。

默认的clone方法是否能通过调用可变引用对象的clone方法得到解决。

对涉及的每一个类,深拷贝要满足:

x.clone() != x为 true,

x.clone().getClass() == x.getClass()为true,

x.clone().equals(x)也为 true ,当然equals方法是如此重写过的。

Object类中的clone方法被声明为protected,防止出现文章开头所提到的,子类和超类不在同一个包下的情况,要声明clone为public,来实现深拷贝

java Map深度复制问题

这里的pos是基础类型,不是引用类型,不需要拿出来单独复制,浅clone就可以了,但是attr这个map需要进行深度复制,因为这个是引用类型,复制后的对象修改该属性依然会影响源对象

clone方法可以简单写为

@Override

protected Object clone() throws CloneNotSupportedException {

// TODO Auto-generated method stub

Elem elem = (Elem) super.clone();

MapString, String tempMap = new HashMap();

for (EntryString, String e : this.map.entrySet()) {

/**

* 这里的new String(e.getValue())可以直接用e.getValue()代替,

* 写在这里仅仅是提醒当value是其他对象时需要做下处理,比如一个User对象,如果你直接写成

* tempMap.put(e.getKey(), e.getValue());那么肯定是没什么用的,而要写成

* tempMap.put(e.getKey(), e.getValue().clone());

*/

tempMap.put(e.getKey(), new String(e.getValue()));

}

elem.map = tempMap;

return elem;

}

关于深度复制java和深度复制用什么包的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

The End

发布于:2022-12-03,除非注明,否则均为首码项目网原创文章,转载请注明出处。