每日面试题之介绍一下克隆!

简介: 每日面试题之介绍一下克隆!

克隆的两种方式:

在Java中存在两种克隆方式:


深克隆:是指通过实现Serialzable接口,该种克隆方式不仅克隆对象本身,还克隆对象包含的引用所指向的所有对象。


浅克隆:是指通过实现Cloneable接口,该种克隆方式只克隆对象本身,不克隆对象中的引用指向的对象。


为什么需要使用克隆?

在java中,如果我们想对一个对象进行复制,而且还想保留原有的对象去进行接下来的操作,此时就需要克隆!


实现克隆的方法:

在java中:


对于深克隆的实现,我们先实现Serializable接口,再通过对象的序列化和反序列化实现深克隆


对于浅克隆的实现,我们通过实现Cloneable接口,与深克隆需要实现的Serializable接口一样,该接口中也不包含任何方法,但区别在于,浅克隆的实现还需要重写Object中的clone()方法


此外,BeanUtils,apache和Spring都提供了bean工具,只是这都是浅克隆。


深克隆与浅克隆的区别:

虽然深克隆和浅克隆都是用来创建对象副本的方式,但它们之间存在着重要的区别:


1:浅克隆只复制对象本身和对象中的基本类型字段,不复制对象中引用类型字段,而深克隆通过递归将整个对象以及对象引用的对象全部复制。


2:浅克隆创建的对象与原始对象共享内部对象,对新对象的修改可能会影响到原始对象,而深克隆创建的对象与原始对象完全独立,对新对象的修改不会影响到原始对象。


3:浅克隆通常比深克隆更快,因为它不需要复制整个对象树。但是,如果对象树很大或者包含循环引用,深克隆可能会导致性能问题或者无限循环


深克隆与浅克隆如何选择?

1:当需要创建一个与原始对象完全独立的副本时,应该使用深克隆,而当只需要在对象之间共享一些内部对象或者需要快速创建对象副本时,可以使用浅克隆。


2:当一个对象有一个引用类型字段,其中包含了对该对象本身的引用,浅克隆会导致无限递归的克隆,这种情况下,只能使用深克隆。


对于二者我们更推荐使用序列化和反序列化实现克隆,因为基于序列化和反序列化实现的克隆不仅仅是深度克隆,更重要的是通过泛型限定,可以检查出要克隆的对象是否支持序列化,这项检查是编译器完成的,不是在运行时抛出异常,这种方案明显优于使用Object类的clone方法克隆对象,让问题在编译的时候暴露出来总好过把问题留到运行时。


最后补充一下有关泛型限定的知识!


泛型限定:

泛型限定是指在泛型中对类型参数进行限制,以确保类型参数满足某些特定条件。


限定可以是类、接口或类和接口的组合。


在Java中,泛型限定使用 extends 关键字。

如果要限定某个泛型类型参数必须是某个类或其子类,可以使用 extends 关键字,例如:

//这表示泛型类型参数 T 必须是 Number 类或其子类。
class MyClass<T extends Number> {
 ... 
 }

如果要限定泛型类型参数必须实现某个接口,可以使用 extends 关键字,例如:

//这表示泛型类型参数 T 必须实现 Comparable 接口。
class MyClass<T extends Comparable<T>> { 
... 
}

如果要同时限定泛型类型参数必须是某个类或其子类以及实现某个接口,可以使用 extends 关键字,例如:

//这表示泛型类型参数 T 必须是 Number 类或其子类,并且实现 Comparable 接口。
class MyClass<T extends Number & Comparable<T>> {
 ...
  }
相关文章
|
5月前
|
存储 算法 开发工具
深入剖析Git对象底层原理
Git 在中间做了什么,它如何存储不同的文件和内容,以及如何区分不同分支下的文件版本呢?日常操作对这些自动的操作都是无感的。 但是如果哪天一旦上述操作中出现了错误,需要找回自己的代码时,如果不懂 Git 其内部存储原理,是没法找回的,因此为了避免这种情况,就有必要去了解其内部的存储——Git 对象的原理。
33 0
深入剖析Git对象底层原理
|
11月前
|
存储
【克隆方法+深浅拷贝】
【克隆方法+深浅拷贝】
61 0
|
安全 开发工具 git
几分钟搞懂git常用操作
几分钟搞懂git常用操作
133 1
|
开发工具 git
git clone避坑的万能步骤
git clone避坑的万能步骤
1972 1
|
缓存 程序员 开发工具
手把手教学,如何解决 git 冲突?
手把手教学,如何解决 git 冲突?
145 0
|
Java 编译器
Java 最常见的面试题:如何实现对象克隆?
Java 最常见的面试题:如何实现对象克隆?
|
Linux Shell 开发工具
Git使用教程之本地仓库的基本操作
一个分布式版本控制系统,和SVN类似,但远比SVN强大的一个版本控制系统。 ①Git可以方便的在本地进行版本管理,如同你本地有一个版本管理服务器一样我们可以选择在合适的时间将本地版本推送到统一的版本管理服务器 ②Git每次会提取整个代码仓库的完整镜像,相当于对整个代码仓库都进行了一次备份,这样计时版本服务器除了问题,我们可以直接采用本地仓库恢复!结合本地版本管理功能,远程版本管理服务器出问题了,我们依然能继续写自己的代码,当他恢复的时候我们再提交我们的本地版本! Git研发初期是为了更好的管理Linux内核,不过现在已经广泛应用于各种项目中!
214 0
|
安全 前端开发 Shell
git相关问题解析,你想要的都有🔥
git相关问题解析,你想要的都有🔥
174 0
git相关问题解析,你想要的都有🔥
|
PHP 开发者
对象克隆|学习笔记
快速学习对象克隆
对象克隆|学习笔记
|
前端开发 安全 Linux
搞!分享3个Git应用案例的骚操作,赶紧用!
搞!分享3个Git应用案例的骚操作,赶紧用!
搞!分享3个Git应用案例的骚操作,赶紧用!