新数据结构(7)——Object

news/2025/2/14 0:58:40/

Object类是所有类的父类,在 Java 中,每个类都直接或间接地继承自Object类,也就是说所有类都是object类的子类可以使用Object里的方法。

equals()和hashCode()是Java中Object类所包含的两个关键方法,下面将介绍两个方法。

==和equals的区别和联系

==运算符和equals()方法都是用于在Java编程中判断两个对象或值是否相等的方式。

在Java编程语言中,基本数据类型只能使用==运算符来判断它们的值是否相等;而对于引用数据类型,使用==运算符判断的是它们所引用的内存地址是否相同。

在Java中,equals()方法只能在引用数据类型的对象上使用,用于比较两个对象的内容是否相等;然而,Object类中的equals()方法默认实现实际上是通过==运算符来比较两个对象变量所指向的内存地址是否相同,除非该方法在子类中被重写以提供不同的比较逻辑。

如下图,如下图所示,尝试直接使用equals()方法对两个基本数据类型(如int、float等)进行比较会导致编译错误。这是因为基本数据类型不是对象,它们没有内置的方法可以调用。equals()方法是定义在Object类中的,而基本数据类型需要被封装成对应的包装类(如Integer、Float等)后才能使用equals()方法进行比较。

如下图,a1 == a2:这个比较是检查a1a2两个对象引用是否指向同一个对象。在这个例子中,a1a2是通过两次调用new String("")创建的,这意味着它们在内存中有两个不同的对象实例,即使它们的内容都是空字符串。因此,a1 == a2的结果是false。a1.equals(a2):这个比较是检查a1a2两个字符串对象的内容是否相同。在Java中,String类的equals方法被重写以比较字符串的内容而不是它们的引用。由于a1a2都是空字符串(""),它们的内容是相同的。因此,a1.equals(a2)的结果是true。

hashCode()

介绍

在Java中,hashCode()方法本质上是一个本地方法(native method),它的具体实现是通过C++语言编写的,并且作为Java Native Interface(JNI)的一部分,允许Java代码与用其他编程语言(如C++)编写的代码进行交互。

作用

hashCode()将用户的对象的地址映射为一个int类型的数据。

hashCode()方法的作用是将一个对象的内部状态通过一个哈希函数映射为一个整数(int类型)的数据,这个整数通常用于在哈希表中快速定位对象的位置。

通过hashCode()方法生成的哈希值,可以使得对象在哈希表(Hash Table)数据结构中实现快速的定位和查询操作。具体而言,哈希表利用哈希函数将对象的哈希码映射到表中的特定位置,从而实现对象的快速存取。

为什么重写equals()方法一定要重写hashCode()方法

具体代码

如下图所示,equals()方法是Java中Object类的一个成员方法,它可以被子类重写,以实现子类特有的对象相等性判断逻辑。这种重写机制是面向对象编程中多态性的体现,允许子类根据需要提供自定义的equals()方法实现,以替代父类(即Object类)中的默认实现,这就像普通的子类和父类一样。

原因

为什么在Java中重写equals()方法时一定要同时重写hashCode()方法呢?这是为了确保equals()方法和hashCode()方法对于相等的对象能够返回一致的结果。具体来说,当我们在使用哈希表(如HashMap、HashSet等)进行对象的定位和查询时,会依赖于这两个方法。如果仅重写了equals()方法而没有相应地重写hashCode()方法,那么可能会出现在哈希表中通过hashCode()方法定位到相同位置的对象,在使用equals()方法进行详细比较时却不相等的情况。这种不一致性会导致哈希表的行为异常,如无法正确存储或检索对象,从而引发程序错误或bug。


http://www.ppmy.cn/news/1571832.html

相关文章

linux的三剑客和进程处理

Linux三剑客: grep:查找 sed:编辑 awk:分析 grep - 正则表达式 [rootlocalhost ~]# grep ^a hello.txt abc grep - 忽略大小写,还有一些场景需要查询出来对应字符串所在的行号,方便我们快速在文件中定位字…

联想电脑如何进入BIOS?

打开设置 下滑找到更新与安全 点击恢复和立即重新启动 选择疑难解答 选择UEFI固件设置 然后如果有重启点击重启 重启开机时一直点击FNF10进入BIOS界面

Spring Boot 中的事务管理:默认配置、失效场景及集中配置

Spring Boot 提供了强大的事务管理功能,基于 Spring 的 Transactional 注解。本文将详细介绍事务的默认配置、事务失效的常见场景、以及事务的几种集中配置方式,并给出相应的代码片段。 一、事务的默认配置 在 Spring Boot 中,默认情况下&am…

TCP/IP 协议图解 | TCP 协议详解 | IP 协议详解

注:本文为 “TCP/IP 协议” 相关文章合辑。 未整理去重。 TCP/IP 协议图解 退休的汤姆 于 2021-07-01 16:14:25 发布 TCP/IP 协议简介 TCP/IP 协议包含了一系列的协议,也叫 TCP/IP 协议族(TCP/IP Protocol Suite,或 TCP/IP Pr…

安川伺服控制器MP系列优势特点及行业应用

在工业自动化领域,运动控制器的性能直接决定了设备的精度、效率和可靠性。作为全球领先的运动控制品牌,安川电机伺服控制器凭借其卓越的技术优势和广泛的应用场景,正在为智能制造注入强劲动力! MP3100:主板型运动控制…

数据可视化:让数据讲故事的力量

数据可视化:让数据讲故事的力量 在大数据时代,数据无处不在。每天,我们都在生成和消耗大量的数据。但仅有数据本身并不足够,我们需要一种方式将这些数据转化为有意义的信息,这就是数据可视化的力量所在。通过数据可视…

AI前端开发:赋能开发者,提升解决实际问题的能力

近年来,人工智能技术飞速发展,深刻地改变着各行各业。在软件开发领域,AI写代码工具的出现更是引发了一场革命,尤其是前端开发领域,AI的应用正在显著提升开发者的解决实际问题的能力。本文将探讨AI前端开发如何提升效率…

20250210解决WPS固定某一行在单元格在表头

20250210解决WPS固定某一行在单元格在表头 2025/2/10 16:56 缘起:需要处理锂电池的电池曲线【RK3566Android13】,需要固定处于表格中间的一行: 绝对时间 记录序号 相对时间(min) 状态 电流(mA) 电压(V) 容量(mAh) 能量(…