整理好了!2024年最常见 100 道 Java基础面试题(四十一)

上一篇地址:整理好了!2024年最常见 100 道 Java基础面试题(四十)-CSDN博客

八十一、equals 和 hashCode 的区别和联系?

在Java中,equals() 方法和 hashCode() 方法是对象比较和散列表(如 HashMapHashSet)存储中的关键组成部分。它们之间有紧密的联系,但也存在一些重要的区别。

equals() 方法

  1. 目的equals() 方法用于比较两个对象是否相等。它的默认实现检查对象引用的相等性,即比较是否为同一个对象。
  2. 重写:在实际应用中,通常需要重写 equals() 方法来提供逻辑上的等价性判断,比如比较对象的属性值。
  3. 使用场景:常用于对象的比较,如在 HashMap 中查找特定的键值对。

hashCode() 方法

  1. 目的hashCode() 方法返回对象的散列码(一个整数)。在散列表中,散列码用于确定对象存储的索引位置。
  2. 重写:当重写 equals() 方法时,也应该重写 hashCode() 方法,以保持两者之间的一致性。
  3. 使用场景:主要用于散列表的索引操作,如在 HashMap 中根据键快速定位到值。

区别

  1. 功能equals() 是用于比较对象的等价性,而 hashCode() 是用于生成对象的散列码。
  2. 返回类型equals() 返回布尔值(boolean),而 hashCode() 返回一个整数(int)。
  3. 调用equals() 是在对象间进行比较时显式调用的,hashCode() 通常在对象作为散列键时由系统隐式调用。

联系

  1. 一致性:如果两个对象通过 equals() 方法比较是相等的,那么它们的 hashCode() 方法必须返回相同的散列码。
  2. 散列表性能:在散列表中,equals() 和 hashCode() 配合使用可以提高查找、插入和删除操作的性能。

重要原则

根据Java的官方文档,重写 equals() 方法时必须遵守以下原则:

  • 自反性:对于任何非空引用 xx.equals(x) 应该返回 true
  • 对称性:对于任何非空引用 x 和 yx.equals(y) 应该与 y.equals(x) 返回相同的结果。
  • 传递性:对于任何非空引用 xy 和 z,如果 x.equals(y) 返回 truey.equals(z) 返回 true,那么 x.equals(z) 也应该返回 true
  • 一致性:对于任何非空引用 x 和 y,只要在比较过程中它们代表的信息没有被修改,多次调用 x.equals(y) 应该持续返回相同的结果。
  • 非空性:对于任何非空引用 xx.equals(null) 应该返回 false

同时,重写 hashCode() 方法时必须遵守:

  • 一致性:在Java应用程序执行期间,只要对象的equals比较所用的信息没有被修改,那么该对象的hashCode值就应该保持不变。
  • 等效性:如果两个对象通过equals方法比较是相等的,那么这两个对象调用hashCode方法必须产生相同的整数结果。
  • 效率:尽管不严格要求,但建议覆盖hashCode方法的算法能够均匀地分布对象的hashCode值。

示例

public class Person {private String name;private int age;@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

在这个示例中,Person 类重写了 equals() 方法和 hashCode() 方法,以确保两个 Person 对象在逻辑上相等时,它们的散列码也相同。

总结

equals()hashCode() 是Java中用于对象比较和散列表操作的两个基础方法。它们之间有紧密的联系,尤其是在散列表的使用中。正确实现这两个方法对于确保对象的比较逻辑和散列表的性能至关重要。

八十二、两个对象 equals 相等, hashCode 也相等么?

在Java中,如果两个对象通过 equals() 方法比较结果为相等,那么它们的 hashCode() 方法必须返回相同的散列码。这是 Object 类中 hashCode() 方法的约定,也是实现一个良好的散列表行为的基础。

equals() 方法和 hashCode() 方法的约定

根据Java的官方文档,当你重写 equals() 方法时,必须遵守以下与 hashCode() 方法相关的约定:

  • 等效性:如果两个对象通过 equals() 方法比较是相等的(即 x.equals(y) 返回 true),那么这两个对象调用 hashCode() 方法必须产生相同的整数结果。

这个约定确保了在散列表(如 HashMapHashSet)中,相等的对象能够被映射到同一个散列桶(或称为槽位)。

示例

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}@Overridepublic boolean equals(Object obj) {if (this == obj) return true;if (obj == null || getClass() != obj.getClass()) return false;Person person = (Person) obj;return age == person.age && Objects.equals(name, person.name);}@Overridepublic int hashCode() {return Objects.hash(name, age);}
}

在这个示例中,Person 类重写了 equals() 方法和 hashCode() 方法。如果两个 Person 对象具有相同的 nameage,它们通过 equals() 方法比较将返回 true,并且它们的 hashCode() 方法将返回相同的散列码。

注意事项

  • 如果不遵守这个约定,那么使用相等的对象作为键的散列表(如 HashMap 的键)将无法正常工作,因为相等的对象可能会被映射到不同的散列桶,导致无法通过键查找到对应的值。
  • 即使两个对象的 equals() 方法返回 false,它们的 hashCode() 方法也可能返回相同的散列码,但这并不是一个好的实践,因为它会降低散列表的性能。

总结

两个对象如果通过 equals() 方法比较结果为相等,它们的 hashCode() 方法也应该返回相同的散列码。这是Java中对象相等性和散列码一致性的基本约定,对于维护散列表的完整性和性能至关重要。正确实现这两个方法对于确保对象在集合中的预期行为非常关键。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/836310.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MFC窗口更新与重绘

窗口更新与重绘 窗口或控件更新其外观的情况通常包括以下几种: 窗口大小变化: 当用户调整窗口大小时,窗口的客户区大小会改变,需要重新绘制窗口内容以适应新的大小。 窗口重叠或暴露: 当窗口被其他窗口遮挡部分或完…

axios、fetch和ajax

axios、fetch和ajax都是在前端开发中用于发送HTTP请求的工具或技术,但它们之间存在一些明显的区别。 ajax: Ajax即Asynchronous Javascript And XML(异步JavaScript和XML),是一种在2005年被提出的技术,用于…

「 安全设计 」68家国内外科技巨头和安全巨头参与了CISA发起的安全设计承诺,包含MFA、默认密码、CVE、VDP等七大承诺目标

美国网络安全和基础设施安全局(CISA,CyberSecurity & Infrastructure Security Agency)于2024年5月开始呼吁企业是时候将网络安全融入到技术产品的设计和制造中了,并发起了安全设计承诺行动,该承诺旨在补充和建立现…

Android13屏幕旋转的基本逻辑

1.问题 1.settings put system user_rotation 1是什么意思 答案:设置用户期望的屏幕转向,0代表:Surface.ROTATION_0竖屏;1代表:Surface.ROTATION_90横屏 2.设置user_rotation和GSensor哪个优先级更高,比…

「PHP系列」PHP MySQL 创建数据库/创建表/插入数据

文章目录 一、PHP MySQL 创建数据库二、PHP MySQL 创建表三、PHP MySQL 插入数据四、相关链接 一、PHP MySQL 创建数据库 要在 PHP 中使用 MySQL 创建数据库,你通常不能直接通过 PHP 脚本直接在数据库服务器上执行这个操作,因为创建数据库通常是一个管理…

Vue router(路由守卫)

全局路由守卫 全局前置守卫 (router.beforeEach): 位置:在src/router/index.js文件中配置。 作用:对任何路由跳转(包括首次加载、手动导航、编程式导航)进行统一拦截。 示例代码: const router new VueRouter({ /* .…

一个物业管理服务项目的思考——智慧停车场无人值守呼叫系统到电梯五方对讲再到呼叫中心

目录 起源智慧停车场无人值守呼叫系统然后电梯五方对讲系统又然后物业呼叫中心集控E控中心怎么做 之前介绍过一个关于 点这个链接:门卫、岗亭、值班室、门房、传达室如果距离办公室和机房比较远的情况下怎么实现电话通话,基本上属于物业管理服务的范围。…

强化学习在一致性模型中的应用与实验验证

在人工智能领域,文本到图像的生成任务一直是研究的热点。近年来,扩散模型和一致性模型因其在图像生成中的卓越性能而受到广泛关注。然而,这些模型在生成速度和微调灵活性上存在局限。为了解决这些问题,康奈尔大学的研究团队提出了…

【STM32+HAL+Proteus】系列学习教程---中断(NVIC、EXTI、按键)

实现目标 1、掌握STM32的中断知识 2、学会STM32CubeMX软件关于中断的配置 3、具体目标:1、外部中断检测按键,每按一次计一次数,满5次LED1状态取反。 一、中断概述 1.1、中断定义 CPU执行程序时,由于发生了某种随机的事件(包括…

实验室纳新宣讲会(java后端)

前言 这是陈旧已久的草稿2021-09-16 15:41:38 当时我进入实验室,也是大二了,实验室纳新需要宣讲, 但是当时有疫情,又没宣讲成。 现在2024-5-12 22:00:39,发布到[个人]专栏中。 实验室纳新宣讲会(java后…

基于GD32的简易数字示波器(4)- 软件

这期记录的是项目实战,做一个简易的数字示波器。 教程来源于嘉立创,帖子主要做学习记录,方便以后查看。 本期主要介绍GD32的keil5环境和串口下载。详细教程可观看下方链接。 软件-第1讲-工程模板新建_哔哩哔哩_bilibili 2.1 开发环境搭建 …

logback日志持久化

1、问题描述 使用logback持久化记录日志。 2、我的代码 logback是Springboot框架里自带的&#xff0c;所以只要引入“spring-boot-starter”就行了。无需额外引入logback依赖。 pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns&…

2005-2022年各省居民人均可支配收入数据(含城镇居民人均可支配收入、农村居民人均可支配收入)(无缺失)

2005-2022年各省居民人均可支配收入数据&#xff08;含城镇居民人均可支配收入、农村居民人均可支配收入&#xff09;&#xff08;无缺失&#xff09; 1、时间&#xff1a;2005-2022年 2、来源&#xff1a;国家统计局、统计年鉴 3、指标&#xff1a;全体居民人均可支配收入、…

探索大型语言模型(LLM)的世界

​ 引言 大型语言模型&#xff08;LLM&#xff09;作为人工智能领域的前沿技术&#xff0c;正在重塑我们与机器的交流方式&#xff0c;在医疗、金融、技术等多个行业领域中发挥着重要作用。本文将从技术角度深入分析LLM的工作原理&#xff0c;探讨其在不同领域的应用&#xff0…

开源软件托管平台gogs操作注意事项

文章目录 一、基本说明二、gogs私有化部署三、设置仓库git链接自动生成参数四、关闭新用户注册入口 私有化部署gogs托管平台&#xff0c;即把gogs安装在我们自己的电脑或者云服务器上。 一、基本说明 系统环境&#xff1a;ubuntu 20.4docker安装 二、gogs私有化部署 前期准…

【编写控制手机压测的脚本】

编写一个控制手机压测的脚本可以使用Python语言来实现。以下是一个简单的示例脚本&#xff1a; import subprocess import time# 打开app subprocess.call(["adb", "shell", "am", "start", "-n", "com.example.app/.…

Ansible常用变量【上】

转载说明&#xff1a;如果您喜欢这篇文章并打算转载它&#xff0c;请私信作者取得授权。感谢您喜爱本文&#xff0c;请文明转载&#xff0c;谢谢。 在Ansible中会用到很多的变量&#xff0c;Ansible常用变量包括以下几种&#xff1a; 1. 自定义变量——在playbook中用户自定义…

springboot整合rabbitmq的不同工作模式理解

前提是已经安装并启动了rabbitmq&#xff0c;并且项目已经引入rabbitmq&#xff0c;完成了配置。 不同模式所需参数不同&#xff0c;生产者可以根据参数不同使用重载的convertAndSend方法。而消费者均是直接监听某个队列。 不同的交换机是实现不同工作模式的关键组件.每种交换…

权限及权限操作

1.命令行解释器 Linux将命令行解释器称为外壳程序shell 命令行解释器的作用就是将用户输入的指令转换为操作系统能够直接执行的指令。同时将操作系统的反馈转换为用户能看懂的反馈&#xff0c;解决了用户和操作系统沟通成本的问题。与此同时&#xff0c;命令行解释器还能够拦…

java项目之校园失物招领系统(springboot+vue+mysql)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的校园失物招领系统。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 校园失物招领系统的主要…