equals 方法的详细用法

news/2024/12/19 9:37:03/文章来源:https://www.cnblogs.com/258-333/p/18616408

equals 方法是 Java 中用于比较两个对象是否“相等”的方法,属于 Object 类。因为所有类都直接或间接继承自 Object,所以每个类都有 equals 方法。

以下是对 equals 方法的详细讲述:


1. equals 的定义

equals 方法定义在 java.lang.Object 类中:

public boolean equals(Object obj) {return (this == obj);
}
  • 默认实现是比较两个对象的内存地址(引用地址),只有当两个引用指向同一个对象时才返回 true
  • 通常会被子类(如 StringInteger 等)重写,用于比较实际的值是否相等。

2. equals 的基本用法

(1)用于比较基本对象

Object obj1 = new Object();
Object obj2 = new Object();System.out.println(obj1.equals(obj2)); // 输出 false,因为它们是不同的对象。Object obj3 = obj1;
System.out.println(obj1.equals(obj3)); // 输出 true,因为它们是同一个引用。

(2)用于字符串比较

String 类重写了 equals 方法,用于比较字符串的内容是否相同:

String str1 = "hello";
String str2 = "hello";System.out.println(str1.equals(str2)); // 输出 true,内容相同。

(3)用于包装类比较

包装类(如 IntegerDouble 等)也重写了 equals 方法,用于比较值是否相等:

Integer num1 = 100;
Integer num2 = 100;System.out.println(num1.equals(num2)); // 输出 true,值相等。

3. equals 的使用场景

(1)基本对象的引用比较

如果没有重写 equals,它默认比较引用地址是否相同。

(2)集合中的对象比较

在集合中,如 ListSet,会使用 equals 方法来判断元素是否重复。例如:

Set<String> set = new HashSet<>();
set.add("A");
set.add("A");System.out.println(set.size()); // 输出 1,因为字符串 "A" 被认为是相等的。

(3)自定义类的值比较

对于自定义类,如果需要比较对象的内容,而非引用地址,通常需要重写 equals 方法。


4. 重写 equals 方法

(1)标准实现

在重写 equals 方法时,需要遵守以下规则:

  1. 自反性x.equals(x) 必须返回 true
  2. 对称性x.equals(y)y.equals(x) 必须一致。
  3. 传递性:如果 x.equals(y)y.equals(z)true,则 x.equals(z) 也必须为 true
  4. 一致性:多次调用 x.equals(y) 的结果必须一致。
  5. null 比较:任何对象与 null 比较必须返回 false

(2)示例代码

假设有一个 Person 类,包含 nameage 两个字段,重写 equals 方法如下:

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);}
}

使用示例:

Person p1 = new Person("Alice", 25);
Person p2 = new Person("Alice", 25);System.out.println(p1.equals(p2)); // 输出 true,因为字段相同。

5. 与 == 的区别

equals ==
比较的是对象的内容(通常需要重写)。 比较的是对象的内存地址(引用地址)。
用于判断两个对象是否“值相等”。 用于判断两个引用是否指向同一个对象。

示例:

String str1 = new String("hello");
String str2 = new String("hello");System.out.println(str1 == str2);        // 输出 false,不是同一个引用。
System.out.println(str1.equals(str2));  // 输出 true,内容相同。

6. equals 方法的注意事项

(1)比较时避免 NullPointerException

使用 equals 时,最好确保调用方不为空。如果不确定,可以使用常见的 常量在前 写法:

String str = null;
System.out.println("hello".equals(str)); // 输出 false,避免空指针异常。

(2)与 hashCode 一起重写

当重写 equals 方法时,通常也需要重写 hashCode 方法,否则可能导致集合操作出现问题。例如:

  • HashSetHashMap 中,equalshashCode 必须一致。

7. 常见实现类的 equals 行为

(1)String

比较字符串的内容:

String str1 = "hello";
String str2 = new String("hello");System.out.println(str1.equals(str2)); // 输出 true。

(2)Integer

比较数值是否相等:

Integer num1 = 100;
Integer num2 = 100;System.out.println(num1.equals(num2)); // 输出 true。

(3)ArrayListHashSet

比较集合中的元素是否相等:

List<String> list1 = Arrays.asList("A", "B");
List<String> list2 = Arrays.asList("A", "B");System.out.println(list1.equals(list2)); // 输出 true。

总结

  • equals 方法用于判断两个对象是否相等,默认实现是比较引用地址。
  • 通常需要在自定义类中重写,用于比较实际值。
  • == 不同,equals 更适合用于值比较。
  • 在集合框架中广泛应用,需要与 hashCode 方法配合重写以保证一致性。

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

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

相关文章

开箱即用!一个基于 Go 的文件分享工具!

Go File —— 一个基于 Go 实现的文件分享工具,开箱即用,内置图床和视频播放页面,可用于局域网内分享文件和文件夹。大家好,我是 Java陈序员。 今天,给大家介绍一个自托管的文件分享工具,开箱即用!关注微信公众号:【Java陈序员】,获取开源项目分享、AI副业分享、超200…

苍穹外卖day01

nginx、YAPI、swagger、knife4jbug记录知识点记录技术选型用户层的技术,主要都是前端技术; 整体结构后端环境搭建缺少sky-take-out.iml文件,在IEDA的终端输入 mvn idea:module 可生成;导入黑马提供的项目后,IDEA中jdk环境需改为18,Maven地址需改为自己的地址;resources文…

pdfjs 报错提示Failed to load module script

参考文章: pdfjs 报错提示Failed to load module script [JavaScript] MIME type 异常 在服务器好不容易配好nginx转发,jar包,静态资源等,访问网站一切ok,结果打开pdf时,无法预览:F12看了下,接口返回正常啊,说明接口没问题,接着看控制台,oh,问题在这: Failed to lo…

跨境电商双旦选品工具分享——看板软件篇

跨境电商在圣诞节和元旦节期间利用看板软件进行选品时,应充分利用其信息整合、数据分析、任务管理和团队协作等功能,以提升选品的效率和准确性。同时,也要关注市场趋势和消费者需求的变化,及时调整选品策略,以抓住节日销售的黄金时机。跨境电商在圣诞节和元旦节期间利用看…

自定义Snippets常用代码片段提高开发效率

自定义Snippets常用代码片段提高开发效率 日常搬砖过程中,有很多代码是重复的 对于这些代码,可以考虑放进工具类,或者安装snippets插件,或者干脆找以前的代码Ctrl+CV也是常有的事 对于常用又简单直接的代码,如果都放进工具类的某个方法中,未免有些过度封装 每一种框架和语…

加速企业流转:智能企业间文件传输方案,驱动业务高效前行!

企业间文件传输是指在不同企业之间,或企业内部的不同部门、团队之间,以及企业与外部合作伙伴之间,进行文件或数据的传递和共享的过程。这些文件可能包括各种类型的文档、图片、视频、代码等,用于支持企业的项目协作、数据备份、数据迁移、数据分析以及数据共享等需求。企业…

Landsat 使用QA波段去云

GEE中不同的landsat系列影像的波段名称、QA云位数有出入,生搬硬套网上现成的QA去云很容易出错。不同的影像需要设置不同的QA_PIXEL波段名称和比特位数,都在GEE的数据波段说明文档里。当前版本似乎都是3-云、4-云阴影。了解了原理,后面遇到陌生影像也能处理。 def rmCloud(im…

MySQL 时区与 serverTimezone

TL;DR手动为 MySQL 指定非偏移量的时区,以避免 TIMESTAMP 类型夏令时问题和时区转化性能瓶颈 TIMESTAMP 范围:1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 连接 MySQL 数据库时,serverTimezone 参数用于指定数据库服务器的时区,需要设置为与 MySQL 服务端相同的时区My…

【详解】Ftrans安全数据摆渡系统,让数据传输更安全高效且可控!

基于提高安全性、满足合规性要求、保护核心资产、提高性能和可靠性以及风险管理等多方面的考虑,企业一般会选择网络隔离,有助于企业确保网络安全和数据保护,为企业的稳健发展提供有力保障。 一、网络隔离的必要性 1、提高安全性 1)限制潜在攻击者的横向移动:网络隔离可以限…

服务后台报临时上传路径/tmp/tongweb.xxxxxxxxxxxxxxxx.9999/work/Tongweb/localhost/ROOT无效

报错: 当服务后台报org.springframework.web.multipart.MultiPartException,failed to parsemultipart servlet request; nested exception is java.io.IOException,临时上传路径/tmp/tongweb.79923423523523135.9090/work/Tongweb/localhost/ROOT无效;是因为linux过段时间…

在 VS Code 中可以免费使用 GitHub Copilot了!

今天,有一个重大的好消息要分享给大家: 从现在开始,我们可以在 Visual Studio Code 中,免费使用强大的 GitHub Copilot 进行开发啦! 每个人都可以享受到 AI 加持下的丝滑开发体验! 那就让我们一起来看看如何能免费地用上 GitHub Copilot 吧! 1. 下载最新版本的 VS Code…