「深度复制java」深度复制用什么包
今天给各位分享深度复制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和深度复制用什么包的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-03,除非注明,否则均为
原创文章,转载请注明出处。