问题一:简单聊一下关于你对Object的理解

在 Java 中,只有基本数据类型不是对象,比如,数值,布尔和字符类型的值都不是对象。而其余的数据类型都是继承自一个名为Object的类,这个类是所有类的始祖,每个类都是由Object类扩展而来。

如果一个类继承自Object类,我们可以将extends Object给省略掉,如果在一个类的定义中没有明确的指出哪个是它的父类,那么Object类就认为是这个类的父类。

问题二:Object类中有一个registerNatives方法,对此你了解多少?

从方法的命名上我们就可以看出,该方法是用于注册本地(native)方法,主要是为了服务于JNI的,它主要是提供了 java 类中的方法与对应 C++ 代码中的方法的映射,方便jvm去查找调用 C++ 中的方法。

问题三:Object类中有clone方法,聊聊你对这个方法的认识

clone方法是Object类的一个protected的方法,我们可以这样去应用这个方法

  1. 实现Cloneable接口
  2. 重写clone方法,并指定public修饰符。

问题四:为什么我们一定要去实现Cloneable接口,而不是直接去重写这个方法呢?

我们通过源码可以发现这是一个空的接口,clone是从Object类继承的。这个接口只是作为一个标记,指示类设计者了解克隆继承。对象对于克隆也很"偏执",如果一个对象请求克隆,但没有实现这个接口,就会生成一个异常。

在 Java 中,Cloneable这样的接口叫做标记接口,标记接口不包括任何方法,它的唯一作用就是允许在类型查询的时候使用instanceof:

if (obj instanceof Cloneable){    //TODO}

问题五:说一说你对关于深克隆和浅克隆的认识

首先来说一下Object类是如何实现clone,它对这个对象一无所知,所以只能逐个域的进行拷贝。如果对象中的所有数据域都是数值或其他基本类型,拷贝这些域没有任何问题,但是如果对象中包含子对象的引用,拷贝域就会得到相同子对象的另一个引用,这样一来,原对象和克隆对象仍然会去共享一些信息。这种Object类默认实现的clone方法称为浅拷贝(Shallow Clone)。

这里需要注意,关于浅克隆的安全性,如果原对象和浅克隆对象共享的子对象是不可变的,那么这种共享就是安全的。如果子对象属于一个不可变的类,如String,就是这种情况。或者在对象的生命期中,子对象一直包含不变的常量 ,没有更改器方法会改变它,也没有方法会生成它的引用,这种情况同样是安全的。

不过子类对象通常是可变的,这时我们就需要定义深拷贝(Deep Clone),来克隆这个类的所有子对象。

具体实现方法如下:

public Test clone() throws CloneNotSupportedException{     //拷贝该对象    Test cloned = (Test)super.clone();     //拷贝该对象中的可变域    cloned.time = (Date) time.clone();    return cloned;}

这里需要提到的一点是:

虽然我们已经学习了clone的两种用法,但是在实际的编码中还是尽量少用这个方法,它具有天生的不稳定性,仅仅了解即可。即使是Java的标准库中也只有5%的类实现了这个方法。

我们可以使用Java的对象串行化特性来实现克隆对象,虽然效率不高,但是很安全,而且很容易实现。

问题六: 关于equals方法,说说是什么?

Object类中的equals方法用于检测一个对象是否等于另一个对象。在Object类中,这个方法将判断两个对象是否具有相同的引用。如果两个对象具有相同的引用,它们一定是相等的。

问题七:有没有自己去重写过equals方法呢?

当然,这个我有笔记~

问题八:不限于Object,聊聊hashCode

在Java中,hash code是由对象导出的一个整型值,以下是几个常见哈希值的算法:

  1. Object类的hashCode()。返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2. String类的hashCode()。根据String类包含的字符串的内容,根据一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
  3. Integer类,返回的哈希码就是Integer对象里所包含的那个整数的数值,例如Integer i1=new Integer(100),i1.hashCode的值就是100 。由此可见,2个一样大小的Integer对象,返回的哈希码也一样。

问题九:说说Equals和 Hashcode的关系

这两个其实确切意义上并没有什么联系,前提是我们不会在HashSet,HashMap这种本质是散列表的数据结构中使用,如果我们要在HashSet,HashMap这种本质是散列表的数据结构中使用,在重写equals方法的同时也要重写hashCode方法,以便用户将对象插入到散列表中,否则会导致数据不唯一,内存泄漏等各种问题。

1.hashCode是为了提高在散列结构存储中查找的效率,在线性表中没有作用。

2.equals()和hashCode()需要同时覆盖,而且定义必须一致,也就是说equals比较了哪些域,hashCode就会对哪些域进行hash值的处理。

3.若两个对象equals()返回true,则hashCode()有必要也返回相同的值。

4.若两个对象equals()返回false,则hashCode()不一定返回不同的值。

5.若两个对象hashCode()返回相同的值,则equals()不一定返回true。

6.若两个对象hashCode()返回不同值,则equals()一定返回false。

7.同一对象在执行期间若已经存储在集合中,则不能修改影响hashCode值的相关信息,否则会导致内存泄露问题。

文章来源:https://segmentfault.com/a/1190000023650667

最后

刚整理 2020 年全套最新精品技术资料免费发给你! (原价最少8999元,超2000G!)

领取 看看下面!!

1、点赞 + 评论 (勾选 “转发” )

2、关注小编私信。点击头像,关注。并私信回复关键词: 1024

如何得到所有子对象_对象可能会迟到,但它永远不会缺席相关推荐

  1. 孙宇晨也许会迟到,但永远不会缺席!

    孙宇晨好像突然就横空出世跑了出来,然后各种刷新人们的三观. 不断的博眼球之后,终于成为一代恶俗网红,成功的吸引了我们的注意力. 今天就来扒一扒这个孙宇晨. 1 巴菲特的午餐 大家对他的第一次印象是在拍 ...

  2. 换脸软件ZAO被“锤”!微信:我的封杀可能会迟到,但不会缺席

    9月2日,在刚刚过去的周末,风靡微信朋友圈的换脸软件ZAO的分享链接被屏蔽,目前在微信访问该分享链接时,页面显示存在安全风险. 8月30日晚,变脸应用"ZAO-逢脸造戏"在朋友圈呈 ...

  3. 复杂存储过程学习_对象存储在无人驾驶高精度地图的场景实践

    在自动驾驶领域有这样一个说法:关注自动驾驶的进展,就看高精地图的动态,因为他们才是加速自动驾驶汽车落地的幕后推手.本文介绍了QingStor®️对象存储的种种优势以及许多针对该场景的特性,分享了对象存 ...

  4. JVM - 结合代码示例彻底搞懂Java内存区域_对象在堆-栈-方法区(元空间)之间的关系

    文章目录 Pre 示例demo 总体关系 代码示例论证 反汇编 Pre JVM - 结合代码示例彻底搞懂Java内存区域_线程栈 | 本地方法栈 | 程序计数器 中我们探讨了线程栈中的内部结构 ,大家 ...

  5. [.NET] 建构子中传递子对象的对象

    在设计对象继承的时候,父对象建构子会需要一些参数,这些参数可以由子对象建构子透过base关键词来提供. namespace Test001 {public class ParentClass{// C ...

  6. 捡对象引流脚本 内容_对象和索引流

    捡对象引流脚本 内容 我本来要写一篇关于如何将流与每个元素的索引混合的文章,但是Baeldung上的人们已经很好地涵盖了这个主题 ! 鉴于我是他们编辑团队的一员,我为他们/我们感到自豪. 有趣的是,特 ...

  7. 可变对象 不可变对象区别_对象应该是不可变的

    可变对象 不可变对象区别 在面向对象的编程中,如果对象的状态在创建后无法修改,则它是不可变的 . 在Java中,不可变对象的一个​​很好的例子是String . 创建后,我们无法修改其状态. 我们可以 ...

  8. 算法偏见是什么_算法可能会使任何人(包括您)有偏见

    算法偏见是什么 在上一篇文章中,我们展示了当数据将情绪从动作中剥离时会发生什么 (In the last article, we showed what happens when data strip ...

  9. python清除列表占用内存_对象的Python列表占用了太多内存

    我有以下代码,它创建了类foo的一百万个对象: for i in range(1000000): bar = foo() list_bar.append(bar) bar对象只有96个字节,由gets ...

最新文章

  1. TCP报文格式和三次握手——三次握手三个tcp包(header+data),此外,TCP 报文段中的数据部分是可选的,在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。...
  2. 面向对象的一个实例 (银行管理系统)
  3. php oop 实际工作,PHP OOP注意点(一)
  4. Lambda expressions are not supported at language level ‘5‘
  5. 【Django】基于Django架构网站代码的目录结构
  6. 如何有效提高你的沟通技巧
  7. 先查询后修改并发的时候sql_SQL调优总结
  8. 一步一步写算法(之线性堆栈)
  9. 19岁黑客找到暴露 Facebook 页面管理员的缺陷,获4500美元奖励
  10. Pspice 使用指南(中文)
  11. R语言 数据整理(reshape2)
  12. 微信8.0下载(可抓包)
  13. 计算机的内存储器应用范围,计算机的内存储器可与cpu什么交换信息
  14. c++跟踪调试怎么用 dev_DEVC++调试方法
  15. 任意文件读取漏洞知识梳理
  16. 使用 Kubernetes 和 Istio 进行基于容器的全面服务监控
  17. B860AV2.1刷机/救砖
  18. 实验10 人机交互的质量与测评
  19. 浏览器伪装成linux,Firefox修改UserAgent伪装成手机浏览器
  20. Java面试题大全(整理版)1000+面试题附答案详解,最全面详细,看完不进你找我

热门文章

  1. Mybatis plus修改了Language Level后,IDEA运行应用出现了Information:java: javacTask: 源发行版 8 需要目标发行版 1.8
  2. java 输出xml文件_java解析xml文件并输出
  3. 员工入职性格测试软件,新员工入职性格测试
  4. logback指定不同包下的日志输出到不同的文件
  5. contains an expression but should be a constant
  6. Spring @Value转义冒号(:)的默认值
  7. Linux升级php
  8. IDEA本地项目与SVN项目关联
  9. Android开发笔记(四十七)Runnable接口实现多线程
  10. ubuntu python3.7修改默认pip版本_详解Ubuntu16.04安装Python3.7及其pip3并切换为默认版本 安装python3后使用pip和pip3的区别...