为什么要使用克隆?
想对一个对象进行处理,又想保留原有的数据进行接下来的操作,就需要克隆了,Java语言中克隆针对的是类的实例。
如何实现对象克隆?
有两种方式:
实现Cloneable接口并重写Object类中的clone()方法;实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆,代码如下:
import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.Serializable; public class MyUtil { private MyUtil() { throw new AssertionError(); } @SuppressWarnings("unchecked") public static <T extends Serializable> T clone(T obj) throws Exception { ByteArrayOutputStream bout = new ByteArrayOutputStream(); ObjectOutputStream oos = new ObjectOutputStream(bout); oos.writeObject(obj); ByteArrayInputStream bin = new ByteArrayInputStream(bout.toByteArray()); ObjectInputStream ois = new ObjectInputStream(bin); return (T) ois.readObject(); // 说明:调用ByteArrayInputStream或ByteArrayOutputStream对象的close方法没有任何意义 // 这两个基于内存的流只要垃圾回收器清理对象就能够释放资源,这一点不同于对外部资源(如文件流)的释放 } }
下面是测试代码:
import java.io.Serializable; /** * 人类 * @author nnngu * */ class Person implements Serializable { private static final long serialVersionUID = -9102017020286042305L; private String name; // 姓名 private int age; // 年龄 private Car car; // 座驾 public Person(String name, int age, Car car) { this.name = name; this.age = age; this.car = car; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Car getCar() { return car; } public void setCar(Car car) { this.car = car; } @Override public String toString() { return "Person [name=" + name + ", age=" + age + ", car=" + car + "]"; } }
/** * 小汽车类 * @author nnngu * */ class Car implements Serializable { private static final long serialVersionUID = -5713945027627603702L; private String brand; // 品牌 private int maxSpeed; // 最高时速 public Car(String brand, int maxSpeed) { this.brand = brand; this.maxSpeed = maxSpeed; } public String getBrand() { return brand; } public void setBrand(String brand) { this.brand = brand; } public int getMaxSpeed() { return maxSpeed; } public void setMaxSpeed(int maxSpeed) { this.maxSpeed = maxSpeed; } @Override public String toString() { return "Car [brand=" + brand + ", maxSpeed=" + maxSpeed + "]"; } }
class CloneTest { public static void main(String[] args) { try { Person p1 = new Person("郭靖", 33, new Car("Benz", 300)); Person p2 = MyUtil.clone(p1); // 深度克隆 p2.getCar().setBrand("BYD"); // 修改克隆的Person对象p2关联的汽车对象的品牌属性 // 原来的Person对象p1关联的汽车不会受到任何影响 // 因为在克隆Person对象时其关联的汽车对象也被克隆了 System.out.println(p1); } catch (Exception e) { e.printStackTrace(); } } }
注意:基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种是方案明显优于使用Object类的clone方法克隆对象。让问题在编译的时候暴露出来总是好过把问题留到运行时。
深拷贝和浅拷贝区别是什么?
浅拷贝只是复制了对象的引用地址,两个对象指向同一个内存地址,所以修改其中任意的值,另一个值都会随之变化,这就是浅拷贝(例:assign())深拷贝是将对象及值复制过来,两个对象修改其中任意的值另一个值不会改变,这就是深拷贝(例:JSON.parse()和JSON.stringify(),但是此方法无法复制函数类型)
到此这篇关于java对象拷贝常见面试题及应答汇总的文章就介绍到这了,更多相关java对象拷贝常见面试题内容请搜索小牛知识库以前的文章或继续浏览下面的相关文章希望大家以后多多支持小牛知识库!
1."请你自我介绍一下。" 介绍内容要与个人简历相一致;表述方式上尽量口语化;要切中要害,不谈无关、无用的内容;条理要清晰,层次要分明;事先最好以文字的形式写好背熟。千万不能说"这些我在简历中都已经写得很清楚了",趁这个机会,把自己的情况再有声有色地陈述一番,效果会比干巴巴的简历好上不知多少倍。 2."你有没有工作经验?"/"你觉得没有工作经验是不是你的一个劣势?" 我在校的时候,曾经在课余时间做
本文向大家介绍33道php常见面试题及答案,包括了33道php常见面试题及答案的使用技巧和注意事项,需要的朋友参考一下 1.在PHP中,当前脚本的名称(不包括路径和查询字符串)记录在预定义变量(1)中;而链接到当前页面的URL记录在预定义变量(2)中。 2.执行程序段将输出(3)。 3.在HTTP 1.0中,状态码 401 的含义是(4);如果返回“找不到文件”的提示,则可用 header 函数,
浅拷贝 # copy_shallow.py import copy import functools @functools.total_ordering class MyClass: def __init__(self, name): self.name = name def __eq__(self, other): return self.
如何组织我的应用程序? There is no definitive answer to this question. The answer depends on the scale of your application and the team that is involved. To be as flexible as possible, Express makes no assumptio
马上就要开学了,新生军训之后就是学生会各部门招人啦。许多人都想要进学生会锻炼自己,结识更多的同学朋友。想要进入学生会首先得经过面试才行,所有面试除了你的自我介绍,还会有提问的。下面出国留学网整理了:学生会面试常见问题及参考答案,希望对你有所帮助。 1. 你对学生会是怎么看的?对于学生会你有什么想法? “学生会是一个集体,我们学生会每一个成员都要时刻维护学生会的优良形象,做好模范带好头。要时时以身
这两天在准备招行fintech产品面试,找了网上挺多面经的,现在来汇总一下看到的各种面经中的问题(侵删) 招行: 基本信息:自我介绍;学校;个人优缺点(结合例子);学术研究;用一个词形容自己;性格中最大的缺点? 过往经历:实习经历介绍、遇到的困难、收获;最有成就感的事;你人生中收到过最有意义的挑战是什么?怎样解决的?;你刚才提到自己喜欢发现问题、解决问题,你过往的经历里有没有这样的例子?;举一个项