服务五象新区开发建设指挥部网站网站备案 seo

张小明 2026/1/1 21:55:51
服务五象新区开发建设指挥部网站,网站备案 seo,济南网站建设与优化,wordpress站点统计文章目录前言一、先搞懂#xff1a;hashCode 到底有什么用#xff1f;1. 哈希码的本质#xff1a;一个 “身份标识” 的简化版2. 核心应用场景#xff1a;哈希集合的高效操作3. 关于 hashCode 的两个重要约定二、再理清#xff1a;equals 方法的本职工作1. Object 类的默认…文章目录前言一、先搞懂hashCode 到底有什么用1. 哈希码的本质一个 “身份标识” 的简化版2. 核心应用场景哈希集合的高效操作3. 关于 hashCode 的两个重要约定二、再理清equals 方法的本职工作1. Object 类的默认实现2. 重写 equals 的正确姿势三、关键核心为什么重写 equals 必须重写 hashCode1. 反例只重写 equals不重写 hashCode2. 反例分析违背了 hashCode 的等价性约定3. 正确做法重写 equals 时必须重写 hashCode四、总结hashCode 与 equals 的核心关联五、面试高频坑点提醒前言大家好我是程序员梁白开今天我们聊一聊hashCode 与 equals。在 Java 面试中hashCode和equals绝对是高频考点很多同学都能说出 “重写 equals 必须重写 hashCode”但问到两者到底有什么用、为什么要强制绑定却常常含糊其辞。今天就带大家从底层原理到实际应用彻底搞懂这两个方法的 “爱恨情仇”。一、先搞懂hashCode 到底有什么用hashCode() 是 Java 中 Object 类的一个原生方法它的核心作用是返回对象的哈希码值int 类型这个哈希码主要用于快速查找是 HashMap、HashSet 等哈希集合的 “性能基石”。1. 哈希码的本质一个 “身份标识” 的简化版你可以把哈希码理解为对象的一个 “简化指纹”。理论上每个对象都有自己的内存地址独一无二但直接用内存地址作为标识进行查找效率并不高。hashCode() 会通过特定算法将对象的内存地址或内部属性转化为一个 int 整数这个整数就是哈希码它的核心价值在于缩小查找范围。2. 核心应用场景哈希集合的高效操作我们以HashMap为例看看 hashCode 是如何发挥作用的当向 HashMap 中 put 元素 时会先计算 key 的 hashCode根据 hashCode 直接定位到对应的哈希桶数组下标。如果该哈希桶为空直接将键值对存入如果不为空再通过 equals() 方法比较桶内元素与新 key 是否相等相等则覆盖旧值不相等则以链表或红黑树的形式挂载解决哈希冲突。当从 HashMap 中 get 元素 时同样先计算 key 的 hashCode快速定位到哈希桶再通过 equals() 精准匹配目标元素。试想一下如果没有 hashCode每次查找都要遍历 HashMap 中的所有元素时间复杂度会从 O (1) 退化到 O (n)在数据量大的场景下性能差距会极其明显。3. 关于 hashCode 的两个重要约定根据 Java 官方文档hashCode() 需要遵循以下通用约定这是我们重写方法的准则一致性在同一个 Java 程序执行期间对同一个对象多次调用 hashCode()必须返回相同的整数前提是对象用于 equals() 比较的属性没有被修改。等价性如果两个对象通过 equals() 方法比较为相等那么它们的 hashCode() 必须返回相同的整数。非唯一性如果两个对象通过 equals() 方法比较为不相等它们的 hashCode() 可以相同这就是哈希冲突但建议不同以提高哈希集合的性能。二、再理清equals 方法的本职工作equals() 同样是 Object 类的原生方法它的核心作用是 判断两个对象是否 “逻辑相等”。1. Object 类的默认实现Object 类中 equals() 的源码如下publicbooleanequals(Objectobj){return(thisobj);}可以看到默认的 equals() 本质上是 比较两个对象的内存地址也就是判断两个引用是否指向同一个对象。但在实际开发中我们往往需要的是 “逻辑相等”。比如对于一个 User 类只要 id 相同我们就认为两个 User 对象是相等的这时候就需要 重写 equals() 方法。2. 重写 equals 的正确姿势以 User 类为例重写 equals() 的规范写法publicclassUser{privateLongid;privateStringname;// 构造方法、getter/setter 省略Overridepublicbooleanequals(Objecto){// 1. 自反性自己和自己比较返回 trueif(thiso)returntrue;// 2. 非空性 类型判断避免空指针且确保是同一类if(onull||getClass()!o.getClass())returnfalse;// 3. 类型强转比较核心属性Useruser(User)o;returnObjects.equals(id,user.id);// 用 Objects.equals 避免空指针}}重写 equals() 时要遵循 自反性、对称性、传递性、一致性 这四个原则这里不再展开感兴趣的同学可以查阅官方文档。三、关键核心为什么重写 equals 必须重写 hashCode这是面试的核心问题我们用 反例 来理解这个强制要求的必要性。1. 反例只重写 equals不重写 hashCode假设我们只重写了 User 类的 equals() 方法按 id 比较但没有重写 hashCode()此时 Object 类的默认 hashCode() 会根据对象内存地址生成哈希码。publicstaticvoidmain(String[]args){Useru1newUser(1L,张三);Useru2newUser(1L,李四);// 因为 id 相同equals 返回 trueSystem.out.println(u1.equals(u2));// true// 但默认 hashCode 基于内存地址u1 和 u2 是不同对象哈希码不同System.out.println(u1.hashCode());// 比如123456System.out.println(u2.hashCode());// 比如789012// 放入 HashSet 中HashSetUsersetnewHashSet();set.add(u1);set.add(u2);// 预期因为 u1 和 u2 相等set 中应该只有一个元素// 实际set 中存在两个元素System.out.println(set.size());// 输出 2}2. 反例分析违背了 hashCode 的等价性约定上面的代码中u1 和 u2 通过 equals() 比较为相等但它们的 hashCode() 却不相同这就 违背了 hashCode 的第二个约定。当把这两个对象放入 HashSet 时存入 u1计算 u1 的 hashCode定位到哈希桶 A存入。存入 u2计算 u2 的 hashCode定位到哈希桶 B存入。由于两个对象在不同的哈希桶中HashSet 不会再调用 equals() 进行比较最终导致两个 “相等” 的对象被同时存入集合破坏了 HashSet 的 “元素唯一性” 特性。3. 正确做法重写 equals 时必须重写 hashCode我们为 User 类补充 hashCode() 的重写保证相等的对象具有相同的哈希码OverridepublicinthashCode(){// 基于 equals 中比较的核心属性 id 生成哈希码returnObjects.hash(id);}此时再运行上面的测试代码u1.equals(u2) 为 trueu1.hashCode() 和 u2.hashCode() 也相同。存入 HashSet 时u2 会定位到和 u1 相同的哈希桶通过 equals() 比较后发现相等不会被重复存入。最终 set.size() 输出 1符合预期。四、总结hashCode 与 equals 的核心关联维度hashCodeequals核心作用生成对象哈希码用于快速查找判断两个对象逻辑相等调用时机哈希集合HashMap/HashSet添加、查询元素时优先调用哈希集合中定位到同一哈希桶后用于精准匹配关联规则相等的对象hashCode 必须相同相同 hashCode 的对象equals 不一定相等一句话总结hashCode 是 “粗筛”帮我们快速缩小查找范围equals 是 “细筛”帮我们精准判断对象是否相等。两者协同工作才能保证哈希集合的高效与正确性。五、面试高频坑点提醒不要用随机数生成 hashCode违反一致性约定同一对象多次调用 hashCode 会返回不同值。不要只重写 hashCode 而不重写 equals没有意义哈希集合依然无法正确判断元素唯一性。重写 hashCode 时要基于 equals 中的核心属性比如 equals 比较 id 和 namehashCode 也要包含这两个属性。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

开江建设局网站谷歌seo服务商

RuoYi-Vue3 项目完整指南:从入门到精通部署 【免费下载链接】RuoYi-Vue3 🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统 项目地址: https://gitc…

张小明 2025/12/31 11:25:37 网站建设

企划做网站黑群晖建设个人网站

30分钟零基础打造个性化QQNT主题:从环境搭建到插件开发实战 【免费下载链接】LiteLoaderQQNT LiteLoaderQQNT - QQNT的插件加载器,允许用户为QQNT添加各种插件以扩展功能,如美化主题。 项目地址: https://gitcode.com/gh_mirrors/li/LiteLo…

张小明 2025/12/31 11:21:26 网站建设

网站搭建报价表怎么建免费论坛网站

Linux 服务器配置实战指南 在 Linux 系统的使用过程中,我们常常需要对各种服务进行配置和管理,如打印服务器、Web 服务器、FTP 服务器以及 Windows 文件共享(Samba)服务器等。下面将详细介绍这些服务器的配置方法和相关操作。 打印服务器配置 在处理打印机相关的问题时,…

张小明 2026/1/1 13:43:55 网站建设

怎么做免费网站教程wordpress弱点

技术文档更生动:用Excalidraw制作手绘风格示意图 在撰写技术文档时,你是否也曾为一张“说得清但画不出”的架构图而卡壳?传统的图表工具虽然规整,却总显得冷冰冰的,像是在读说明书;而手绘草图虽有温度&…

张小明 2025/12/31 11:15:18 网站建设

e盘网站建设大型门户网站开发教程

用户环境管理与文件系统安全 1. 用户环境管理 在系统管理中,磁盘配额管理是一项重要工作。系统管理员需要决定检查配额的频率,设定好策略后,可将 warnquota 命令添加到 cron 任务中,使其按固定计划运行。例如,用户 hart 收到磁盘配额警告后,有三种选择:减少磁盘…

张小明 2026/1/1 20:53:05 网站建设

淄博周村学校网站建设公司好推建站

博主介绍 💗博主介绍:✌全栈领域优质创作者,专注于Java、小程序、Python技术领域和计算机毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 2025-2026年最新1000个热门Java毕业设计选题…

张小明 2025/12/31 11:11:13 网站建设