==和 equals 的区别是什么?

==比较内存地址,equals比较内容(若重写)。1. ==操作符对基本类型比较值,引用类型比较地址。2. equals默认行为与==相同,但可被重写以比较对象内容。3. 重写equals时必须同时重写hashcode以保持一致性,确保相等对象哈希码相同。4. string类重写equals以比较字符数组内容。5. 哈希码用于快速定位哈希表中对象位置,未重写hashcode会导致集合类如hashmap无法正确识别相等对象。

==和 equals 的区别是什么?

简单来说,== 比较的是内存地址,而 equals 比较的是对象的内容,但前提是 equals 方法被正确地重写过。

==和 equals 的区别是什么?

解决方案

==equals 是 Java 中用于比较的两种方式,但它们的比较对象和比较内容有着本质的区别。理解它们的区别对于编写正确的 Java 代码至关重要。

==和 equals 的区别是什么?

== 操作符:

比较的是变量所指向的内存地址。对于基本数据类型(如 int, char, boolean 等),== 比较的是它们的值。例如,int a = 5; int b = 5; a == b 的结果是 true。对于引用类型(如 String, Object 等),== 比较的是它们在内存中的地址。即使两个对象的内容完全相同,但如果它们是不同的对象,== 的结果仍然是 false

equals 方法:

==和 equals 的区别是什么?equals 方法是 Object 类中定义的方法,所有 Java 类都继承自 Object 类,因此都具有 equals 方法。默认情况下,equals 方法的行为与 == 相同,即比较的是对象的内存地址。但是,equals 方法可以被重写(override),以便根据对象的内容进行比较。例如,String 类就重写了 equals 方法,使得它可以比较两个字符串的内容是否相同。

什么时候应该重写 equals 方法?

当你需要比较两个对象的内容是否相等,而不是比较它们是否是同一个对象时,就应该重写 equals 方法。 比如,你有一个 Person 类,包含 nameage 属性。如果你希望当两个 Person 对象的 nameage 都相同时,就认为它们相等,那么你就需要重写 equals 方法。

一个简单的 Person 类的 equals 方法示例:

public class Person {    private String name;    private int age;    // 构造函数、getter 和 setter 方法省略    @Override    public 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);    }    @Override    public int hashCode() {        return Objects.hash(name, age);    }}

注意,重写 equals 方法时,通常也需要重写 hashCode 方法,以保证 equals 方法和 hashCode 方法的一致性。如果两个对象 equals 返回 true,那么它们的 hashCode 值必须相同。反之,如果两个对象的 hashCode 值不同,那么它们的 equals 方法必须返回 false

String 类的 equals 方法为什么比较的是内容?

String 类重写了 equals 方法。 String 类将字符串的内容存储在字符数组中,equals 方法比较的是这两个字符数组中的每个字符是否都相同。 这也是为什么即使两个 String 对象是不同的对象,但如果它们包含相同的字符序列,equals 方法也会返回 true

String str1 = new String("hello");String str2 = new String("hello");System.out.println(str1 == str2); // 输出 false,因为 str1 和 str2 是不同的对象System.out.println(str1.equals(str2)); // 输出 true,因为 str1 和 str2 的内容相同String str3 = "hello";String str4 = "hello";System.out.println(str3 == str4); // 输出 true,因为字符串常量池的优化,str3 和 str4 指向同一个对象System.out.println(str3.equals(str4)); // 输出 true,因为 str3 和 str4 的内容相同

HashCode 的作用是什么?为什么重写 equals 的时候需要重写 HashCode?

魔乐社区 魔乐社区

天翼云和华为联合打造的AI开发者社区,支持AI模型评测训练、全流程开发应用

魔乐社区 102 查看详情 魔乐社区

hashCode 方法返回对象的哈希码,它是一个整数值,用于在哈希表(如 HashMap, HashSet 等)中快速查找对象。

快速查找: 哈希表使用哈希码来确定对象在表中的存储位置。当需要查找对象时,哈希表首先计算对象的哈希码,然后根据哈希码快速定位到对象可能存在的桶(bucket)。唯一性: 理想情况下,不同的对象应该产生不同的哈希码,但实际上,由于哈希函数的限制,可能会出现哈希冲突,即不同的对象产生相同的哈希码。

重写 equals 方法时,必须同时重写 hashCode 方法,以保证 equals 方法和 hashCode 方法的一致性。 这是因为哈希表依赖于 hashCode 方法来确定对象的存储位置,如果两个对象 equals 返回 true,但它们的 hashCode 值不同,那么它们在哈希表中会被存储在不同的位置,导致无法正确查找。

假设你只重写了 equals 方法,而没有重写 hashCode 方法,那么两个 equals 返回 true 的对象仍然会有不同的哈希码。 当你将这两个对象放入 HashMap 中时,HashMap 会认为它们是不同的对象,并将它们存储在不同的位置。 当你尝试使用其中一个对象来获取 HashMap 中的值时,HashMap 可能会找不到该对象,导致程序出错。

例如:

import java.util.HashMap;import java.util.Map;public class HashCodeTest {    static class Student {        int id;        String name;        public Student(int id, String name) {            this.id = id;            this.name = name;        }        @Override        public boolean equals(Object obj) {            if (this == obj) return true;            if (obj == null || getClass() != obj.getClass()) return false;            Student student = (Student) obj;            return id == student.id && name.equals(student.name);        }        // 缺少 hashCode 方法    }    public static void main(String[] args) {        Student s1 = new Student(1, "Alice");        Student s2 = new Student(1, "Alice");        Map map = new HashMap();        map.put(s1, "Alice's Info");        System.out.println(map.get(s2)); // 期望输出 "Alice's Info",但实际输出 null    }}

在这个例子中,s1s2equals 方法返回 true,但由于没有重写 hashCode 方法,它们有不同的哈希码。 当你尝试使用 s2HashMap 中获取值时,HashMap 会根据 s2 的哈希码找到一个不同的位置,导致无法找到 s1 对应的值,最终返回 null

如何正确重写 hashCode 方法?

重写 hashCode 方法的目标是为相等的对象生成相同的哈希码,为不相等的对象生成不同的哈希码(尽量)。

以下是一些常用的重写 hashCode 方法的技巧:

使用对象的关键属性: 选择对象的关键属性,这些属性用于确定对象的相等性。使用 Objects.hash() 方法: Objects.hash() 方法可以方便地为多个属性生成哈希码。使用质数 在计算哈希码时,可以使用质数来减少哈希冲突。

例如,对于上面的 Person 类,可以这样重写 hashCode 方法:

@Overridepublic int hashCode() {    return Objects.hash(name, age);}

总结

== 比较的是内存地址,而 equals 比较的是对象的内容(在 equals 方法被重写的情况下)。 当你需要比较两个对象的内容是否相等时,应该重写 equals 方法,并同时重写 hashCode 方法,以保证 equals 方法和 hashCode 方法的一致性。 理解 ==equals 的区别对于编写正确的 Java 代码至关重要,特别是当涉及到集合类(如 HashMap, HashSet 等)时。

以上就是==和 equals 的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/600414.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 20:15:36
下一篇 2025年11月10日 20:22:42

相关推荐

  • 怎样用免费工具美化PPT_免费美化PPT的实用方法分享

    利用KIMI智能助手可免费将PPT美化为科技感风格,但需核对文字准确性;2. 天工AI擅长优化内容结构,提升逻辑性,适合高质量内容需求;3. SlidesAI支持语音输入与自动排版,操作便捷,利于紧急场景;4. Prezo提供多种模板,自动生成图文并茂幻灯片,适合学生与初创团队。 如果您有一份内容完…

    2025年12月6日 软件教程
    100
  • Pages怎么协作编辑同一文档 Pages多人实时协作的流程

    首先启用Pages共享功能,点击右上角共享按钮并选择“添加协作者”,设置为可编辑并生成链接;接着复制链接通过邮件或社交软件发送给成员,确保其使用Apple ID登录iCloud后即可加入编辑;也可直接在共享菜单中输入邮箱地址定向邀请,设定编辑权限后发送;最后在共享面板中管理协作者权限,查看实时在线状…

    2025年12月6日 软件教程
    200
  • REDMI K90系列正式发布,售价2599元起!

    10月23日,redmi k90系列正式亮相,推出redmi k90与redmi k90 pro max两款新机。其中,redmi k90搭载骁龙8至尊版处理器、7100mah大电池及100w有线快充等多项旗舰配置,起售价为2599元,官方称其为k系列迄今为止最完整的标准版本。 图源:REDMI红米…

    2025年12月6日 行业动态
    200
  • Linux中如何安装Nginx服务_Linux安装Nginx服务的完整指南

    首先更新系统软件包,然后通过对应包管理器安装Nginx,启动并启用服务,开放防火墙端口,最后验证欢迎页显示以确认安装成功。 在Linux系统中安装Nginx服务是搭建Web服务器的第一步。Nginx以高性能、低资源消耗和良好的并发处理能力著称,广泛用于静态内容服务、反向代理和负载均衡。以下是在主流L…

    2025年12月6日 运维
    000
  • Linux journalctl与systemctl status结合分析

    先看 systemctl status 确认服务状态,再用 journalctl 查看详细日志。例如 nginx 启动失败时,systemctl status 显示 Active: failed,journalctl -u nginx 发现端口 80 被占用,结合两者可快速定位问题根源。 在 Lin…

    2025年12月6日 运维
    100
  • 华为新机发布计划曝光:Pura 90系列或明年4月登场

    近日,有数码博主透露了华为2025年至2026年的新品规划,其中pura 90系列预计在2026年4月发布,有望成为华为新一代影像旗舰。根据路线图,华为将在2025年底至2026年陆续推出mate 80系列、折叠屏新机mate x7系列以及nova 15系列,而pura 90系列则将成为2026年上…

    2025年12月6日 行业动态
    100
  • Linux如何优化系统性能_Linux系统性能优化的实用方法

    优化Linux性能需先监控资源使用,通过top、vmstat等命令分析负载,再调整内核参数如TCP优化与内存交换,结合关闭无用服务、选用合适文件系统与I/O调度器,持续按需调优以提升系统效率。 Linux系统性能优化的核心在于合理配置资源、监控系统状态并及时调整瓶颈环节。通过一系列实用手段,可以显著…

    2025年12月6日 运维
    000
  • 曝小米17 Air正在筹备 超薄机身+2亿像素+eSIM技术?

    近日,手机行业再度掀起超薄机型热潮,三星与苹果已相继推出s25 edge与iphone air等轻薄旗舰,引发市场高度关注。在此趋势下,多家国产厂商被曝正积极布局相关技术,加速抢占这一细分赛道。据业内人士消息,小米的超薄旗舰机型小米17 air已进入筹备阶段。 小米17 Pro 爆料显示,小米正在评…

    2025年12月6日 行业动态
    000
  • 荣耀手表5Pro 10月23日正式开启首销国补优惠价1359.2元起售

    荣耀手表5pro自9月25日开启全渠道预售以来,市场热度持续攀升,上市初期便迎来抢购热潮,一度出现全线售罄、供不应求的局面。10月23日,荣耀手表5pro正式迎来首销,提供蓝牙版与esim版两种选择。其中,蓝牙版本的攀登者(橙色)、开拓者(黑色)和远航者(灰色)首销期间享受国补优惠价,到手价为135…

    2025年12月6日 行业动态
    000
  • Vue.js应用中配置环境变量:灵活管理后端通信地址

    在%ignore_a_1%应用中,灵活配置后端api地址等参数是开发与部署的关键。本文将详细介绍两种主要的环境变量配置方法:推荐使用的`.env`文件,以及通过`cross-env`库在命令行中设置环境变量。通过这些方法,开发者可以轻松实现开发、测试、生产等不同环境下配置的动态切换,提高应用的可维护…

    2025年12月6日 web前端
    000
  • VSCode选择范围提供者实现

    Selection Range Provider是VSCode中用于实现层级化代码选择的API,通过注册provideSelectionRanges方法,按光标位置从内到外逐层扩展选择范围,如从变量名扩展至函数体;需结合AST解析构建准确的SelectionRange链式结构以提升选择智能性。 在 …

    2025年12月6日 开发工具
    000
  • JavaScript动态生成日历式水平日期布局的优化实践

    本教程将指导如何使用javascript高效、正确地动态生成html表格中的日历式水平日期布局。重点解决直接操作`innerhtml`时遇到的标签闭合问题,通过数组构建html字符串来避免浏览器解析错误,并利用事件委托机制优化动态生成元素的事件处理,确保生成结构清晰、功能完善的日期展示。 在前端开发…

    2025年12月6日 web前端
    000
  • JavaScript响应式编程与Observable

    Observable是响应式编程中处理异步数据流的核心概念,它允许随时间推移发出多个值,支持订阅、操作符链式调用及统一错误处理,广泛应用于事件监听、状态管理和复杂异步逻辑,提升代码可维护性与可读性。 响应式编程是一种面向数据流和变化传播的编程范式。在前端开发中,尤其面对复杂的用户交互和异步操作时,J…

    2025年12月6日 web前端
    000
  • JavaScript生成器与迭代器协议实现

    生成器和迭代器基于统一协议实现惰性求值与数据遍历,通过next()方法返回{value, done}对象,生成器函数简化了迭代器创建过程,提升处理大数据序列的效率与代码可读性。 JavaScript中的生成器(Generator)和迭代器(Iterator)是处理数据序列的重要机制,尤其在处理惰性求…

    2025年12月6日 web前端
    000
  • 环境搭建docker环境下如何快速部署mysql集群

    使用Docker Compose部署MySQL主从集群,通过配置文件设置server-id和binlog,编写docker-compose.yml定义主从服务并组网,启动后创建复制用户并配置主从连接,最后验证数据同步是否正常。 在Docker环境下快速部署MySQL集群,关键在于合理使用Docker…

    2025年12月6日 数据库
    000
  • Linux文件系统rsync命令详解

    rsync通过增量同步高效复制文件,支持本地及远程同步,常用选项包括-a、-v、-z和–delete,结合SSH可安全传输数据,配合cron可实现定时备份。 rsync 是 Linux 系统中一个非常强大且常用的文件同步工具,能够高效地在本地或远程系统之间复制和同步文件与目录。它以“增量…

    2025年12月6日 运维
    000
  • Xbox删忍龙美女角色 斯宾塞致敬板垣伴信被喷太虚伪

    近日,海外游戏推主@HaileyEira公开发表言论,批评Xbox负责人菲尔·斯宾塞不配向已故的《死或生》与《忍者龙剑传》系列之父板垣伴信致敬。她指出,Xbox并未真正尊重这位传奇制作人的创作遗产,反而在宣传相关作品时对内容进行了审查和删减。 所涉游戏为年初推出的《忍者龙剑传2:黑之章》,该作采用虚…

    2025年12月6日 游戏教程
    000
  • 如何在mysql中分析索引未命中问题

    答案是通过EXPLAIN分析执行计划,检查索引使用情况,优化WHERE条件写法,避免索引失效,结合慢查询日志定位问题SQL,并根据查询模式合理设计索引。 当 MySQL 查询性能下降,很可能是索引未命中导致的。要分析这类问题,核心是理解查询执行计划、检查索引设计是否合理,并结合实际数据访问模式进行优…

    2025年12月6日 数据库
    000
  • VSCode入门:基础配置与插件推荐

    刚用VSCode,别急着装一堆东西。先把基础设好,再按需求加插件,效率高还不卡。核心就三步:界面顺手、主题舒服、功能够用。 设置中文和常用界面 打开软件,左边活动栏有五个图标,点最下面那个“扩展”。搜索“Chinese”,装上官方出的“Chinese (Simplified) Language Pa…

    2025年12月6日 开发工具
    000
  • VSCode性能分析与瓶颈诊断技术

    首先通过资源监控定位异常进程,再利用开发者工具分析性能瓶颈,结合禁用扩展、优化语言服务器配置及项目设置,可有效解决VSCode卡顿问题。 VSCode作为主流的代码编辑器,虽然轻量高效,但在处理大型项目或配置复杂扩展时可能出现卡顿、响应延迟等问题。要解决这些性能问题,需要系统性地进行性能分析与瓶颈诊…

    2025年12月6日 开发工具
    000

发表回复

登录后才能评论
关注微信