当前位置: 首页 > news >正文

JAVA软开-面试经典问题(6)-equals与hashcode方法

1.equals方法

1.Object类中的equals方法比较的是两个对象的地址(底层原理是 == 比较的,即比较的是对象的地址)

return (this == obj);

2.基本数据类型的包装类和String类都重写了equals方法。

  1. 基本数据类型:比较的是数值的是否相等
 public boolean equals(Object obj) {if (obj instanceof Integer) {return value == ((Integer)obj).intValue();}return false;}
  1. String类型:比较的是两个String的内容
public boolean equals(Object anObject) {if (this == anObject) {return true;}if (anObject instanceof String) {String anotherString = (String)anObject;int n = value.length;if (n == anotherString.value.length) {char v1[] = value;char v2[] = anotherString.value;int i = 0;while (n-- != 0) {if (v1[i] != v2[i])return false;i++;}return true;}}return false;}

因此,只看equals方法,equals方法与HashCode没关系。

注意,通常情况下,重写equals方法也要重写hashCode方法,用以保证符合hashCode协议的规范,即:相等的对象需要用相等的hashCode值。因此基本数据类型和String类也重写了hashcode方法(后文会继续深入)

2.Hashcode方法

1.在Object类中,Hashcode表示的是将对象的内存地址进行映射成一个哈希值

public native int hashCode();

2.基本数据类型对应的包装类的HashCode方法,也进行了相应的重写。
Integer :

public static int hashCode(int value) {return value;}

3.在String类中HashCode方法

   //s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]int hash = 0;public int hashCode() {int h = hash;if (h == 0 && value.length > 0) {char val[] = value;for (int i = 0; i < value.length; i++) {h = 31 * h + val[i];}hash = h;}return h;}

3.equals和hashcode的关系

先说结论:

  1. hashcode不同,对应的对象一定不同;hashcode相同,对应的对象也不一定相同(可能存在哈希冲突)
  2. equals相同的对象,hashcode是相同的

【经典问题】
1 为什么重写equals方法时,必须重写hashcode方法?

结论:相同的对象应该有相同的hashcode值,确保数据的一致性

当只重写了equals()而没有重写hashcode(),那么两个对象的hashcode值是从内存地址转化而来,一定不相同。即使是equals的。这就会导致这两个equals的对象被存到了哈希表中不同的位置上,这就违反了key的唯一性。

2.反过来,只重写了hashcode()而没有重写equals(),又会有什么问题?

只重写了hashcode()而没有重写equals(),那么equals()比较的相当于就是内存地址,两次new出来的对象一定是不同的,但如果他们的成员属性的值都相同,那么他们的hashcode就是相同的,会存在同一个链表(或红黑树)中。致命的是,再使用get(key)来获取值时,只要这时传入的key和set(key, value)时使用的key不是同一个对象,即使每个成员属性的值都一样,也不能得到想要的结果,因为这两个key是不equals的,会被当做不同key。

(在使用get()查询元素的时候,集合类也先调key.hashCode()算出数组下标,然后看equals()的结果,但如果没有重写equasl方法就会出现不相等的结果。)

综上所述,Java中的equals()和hashcode()必须同时重写,否则哈希表容器将不能正常工作。

参考链接:
https://blog.csdn.net/a745233700/article/details/83186808

相关文章:

JAVA软开-面试经典问题(6)-equals与hashcode方法

1.equals方法 1.Object类中的equals方法比较的是两个对象的地址&#xff08;底层原理是 比较的&#xff0c;即比较的是对象的地址&#xff09; return (this obj);2.基本数据类型的包装类和String类都重写了equals方法。 基本数据类型&#xff1a;比较的是数值的是否相等 …...

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…...

计算机网络基本架构知识点

1. 网络体系结构模型&#xff1a; - OSI 七层模型&#xff1a; - 物理层&#xff1a;是网络通信的基础层&#xff0c;负责在物理介质上传输比特流。该层定义了物理连接的标准&#xff0c;如电缆的类型、接口的形状、插头的规格等&#xff0c;以及信号的传输方式&#xff0c;包括…...

GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体,固定场格式 V3 (ATMOSL2TF)

ATMOS L2 Trace Gases on Potential Temperature Grid, Fixed Field Format V3 (ATMOSL2TF) at GES DISC 简介 GES DISC 的 ATMOS L2 潜在温度网格上的痕量气体&#xff0c;固定场格式 V3 (ATMOSL2TF) 这是版本3的气溶胶痕量分子光谱&#xff08;ATMOS&#xff09;第二级产品…...

MLCC贴片电容不同材质区别:【及电容工作原理】

贴片电容的材质常规有&#xff1a;NPO&#xff08;COG&#xff09;&#xff0c;X7R&#xff0c;X5R&#xff0c;Y5V 等&#xff0c;主要区别是它们的填充介质不同。在相同的体积下由于填充介质不同所组成的电容器的容量就不同&#xff0c;随之带来的电容器的介质损耗、容量稳定…...

Word粘贴时出现“文件未找到:MathPage.WLL”的解决方案

解决方案 一、首先确定自己电脑的位数&#xff08;这里默认大家的电脑都是64位&#xff09;二、右击MathType桌面图标&#xff0c;点击“打开文件所在位置”&#xff0c;然后分别找到MathPage.WLL三、把这个文件复制到该目录下&#xff1a;C:\Program Files\Microsoft Office\r…...

前端开发笔记--html 黑马程序员1

文章目录 前端开发工具--VsCode前端开发基础语法VsCode优秀插件Chinese --中文插件Auto Rename Tag --自动重命名插件open in browserOpen in Default BrowserOpen in Other Browser Live Server -- 实时预览 前端开发工具–VsCode 轻量级与快速启动 快速加载&#xff1a;VSCo…...

ARM/Linux嵌入式面经(四四):华星光电

文章目录 1、自我介绍2、介绍一下你最得意的一个项目3、这个项目里面都用到了什么模块,什么型号,有什么作用4、移植操作系统的过程中,流程是什么,需要注意什么移植操作系统的流程需要注意的事项面试官可能的追问及回答5、你用的传感器挺多的,怎么保证传感器传输的稳定性,…...

帮助,有奖提问

<?php $u $_GET[“user”]; //变量获取 $v $_GET[“variable”]; //$v看flag&#xff0c;绕过正则 $flag‘flag{}; if(isset($u)&&(file_get_contents($u,‘r’)“im admin”)){//猜测data://协议 //检查u指向 echo “hello admin!<br>”; if(preg_…...

Java编辑工具IDEA

哪个编程工具让你的工作效率翻倍&#xff1f; 在日益繁忙的工作环境中&#xff0c;选择合适的编程工具已成为提升开发者工作效率的关键。不同的工具能够帮助我们简化代码编写、自动化任务、提升调试速度&#xff0c;甚至让团队协作更加顺畅。那么&#xff0c;哪款编程工具让你…...

闲谈Promise

预备知识 回调函数&#xff1a;当一个函数作为参数传入另一个函数中&#xff0c;并且它不会立刻执行&#xff0c;当满足一定条件之后&#xff0c;才会执行&#xff0c;这种函数称为回调函数。比如&#xff1a;定时器。异步任务&#xff1a;与之对应的概念是同步任务&#xff0…...

【C++堆(优先队列)】1882. 使用服务器处理任务|1979

本文涉及知识点 C堆(优先队列) LeetCode1882. 使用服务器处理任务 给你两个 下标从 0 开始 的整数数组 servers 和 tasks &#xff0c;长度分别为 n​​​​​​ 和 m​​​​​​ 。servers[i] 是第 i​​​​​​​​​​ 台服务器的 权重 &#xff0c;而 tasks[j] 是处理…...

VBA高级应用30例应用3Excel中的ListObject对象:选择表的一部分

《VBA高级应用30例》&#xff08;版权10178985&#xff09;&#xff0c;是我推出的第十套教程&#xff0c;教程是专门针对高级学员在学习VBA过程中提高路途上的案例展开&#xff0c;这套教程案例与理论结合&#xff0c;紧贴“实战”&#xff0c;并做“战术总结”&#xff0c;以…...

C语言-变量

全局变量可以定义在头文件中吗&#xff1f; 在C和C编程中&#xff0c;全局变量可以定义在头文件中&#xff0c;但通常不建议这样做&#xff0c;因为这可能导致多个源文件&#xff08;.c 或 .cpp 文件&#xff09;包含同一个头文件时&#xff0c;发生多重定义错误&#xff08;m…...

linux下位机出现使用TCP socket为0的问题

问题现象&#xff1a;下位机做TCP服务器&#xff0c;上位机来连接下位机的TCP服务&#xff0c;中间会有主动断开&#xff08;上位机主动关闭socket&#xff09;和异常断开&#xff08;网线断开&#xff09;的情况&#xff0c;出现异常的时候&#xff0c;上位机连接下位机的TCP …...

论文笔记:Prototypical Verbalizer for Prompt-based Few-shot Tuning

论文来源&#xff1a;ACL 2022 论文地址&#xff1a;https://arxiv.org/pdf/2203.09770.pdfhttps://arxiv.org/pdf/2203.09770.pdf 论文代码&#xff1a;https://github.com/thunlp/OpenPrompthttps://github.com/thunlp/OpenPrompt Abstract 基于提示的预训练语言模型&#…...

nn.functional.softmax(X, dim=-1)

dim-1表示在最后一个维度&#xff08;大概率是一行&#xff09;应用Softmax函数&#xff0c;将值标准化为概率分布。 实例 假设我们有一个张量X&#xff0c;形状为&#xff08;2&#xff0c;3&#xff09;&#xff0c;内容如下&#xff1a; import torch import torch.nn.…...

【动态规划】子数组系列(上)

1. 最大子数组和 53. 最大子数组和 状态表示&#xff1a;以 i 位置为结尾时的所有子数组中的最大和 状态转移方程&#xff1a; i 位置为结尾的子数组又可以分为长度为 1 的和大于 1 的&#xff0c;长度为 1 就是 nums[i] &#xff0c;长度不为 1 就是 dp[i - 1] nums[i]&…...

字节青训营入门算法题:飞行棋分组

链接&#xff1a;飞行棋分组&#x1f517;&#x1f517; 题目 现在有一堆飞行棋棋子&#xff0c;每个棋子上标有数字序号。需要将这些棋子分成若干组&#xff0c;每组包含5个棋子&#xff0c;且组内所有棋子的数字序号必须相同。需要判断是否可以完成这样的分组。 解答 为了…...

# 执行 rpm -qa | grep qq 查询软件安装情况时报错 数据库损坏 db3 error(-30974)

执行 rpm -qa | grep qq 查询软件安装情况时报错 数据库损坏 db3 error(-30974) 一、问题描述&#xff1a; 在 linux 系统上&#xff0c;使用包管理工具 rpm 查询某一个软件安装情况&#xff0c;如&#xff1a;执行 rpm -qa | grep qq 时&#xff0c;报错 数据库损坏 db3 err…...

大数据学习栈记——Neo4j的安装与使用

本文介绍图数据库Neofj的安装与使用&#xff0c;操作系统&#xff1a;Ubuntu24.04&#xff0c;Neofj版本&#xff1a;2025.04.0。 Apt安装 Neofj可以进行官网安装&#xff1a;Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)

2025年能源电力系统与流体力学国际会议&#xff08;EPSFD 2025&#xff09;将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会&#xff0c;EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...

【Java学习笔记】Arrays类

Arrays 类 1. 导入包&#xff1a;import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序&#xff08;自然排序和定制排序&#xff09;Arrays.binarySearch()通过二分搜索法进行查找&#xff08;前提&#xff1a;数组是…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

Springboot社区养老保险系统小程序

一、前言 随着我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;社区养老保险系统小程序被用户普遍使用&#xff0c;为方…...

【C++特殊工具与技术】优化内存分配(一):C++中的内存分配

目录 一、C 内存的基本概念​ 1.1 内存的物理与逻辑结构​ 1.2 C 程序的内存区域划分​ 二、栈内存分配​ 2.1 栈内存的特点​ 2.2 栈内存分配示例​ 三、堆内存分配​ 3.1 new和delete操作符​ 4.2 内存泄漏与悬空指针问题​ 4.3 new和delete的重载​ 四、智能指针…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)

安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

华为OD机试-最短木板长度-二分法(A卷,100分)

此题是一个最大化最小值的典型例题&#xff0c; 因为搜索范围是有界的&#xff0c;上界最大木板长度补充的全部木料长度&#xff0c;下界最小木板长度&#xff1b; 即left0,right10^6; 我们可以设置一个候选值x(mid)&#xff0c;将木板的长度全部都补充到x&#xff0c;如果成功…...

uniapp 小程序 学习(一)

利用Hbuilder 创建项目 运行到内置浏览器看效果 下载微信小程序 安装到Hbuilder 下载地址 &#xff1a;开发者工具默认安装 设置服务端口号 在Hbuilder中设置微信小程序 配置 找到运行设置&#xff0c;将微信开发者工具放入到Hbuilder中&#xff0c; 打开后出现 如下 bug 解…...