【IT领域新生必看】Java编程中的神奇对比:深入理解`equals`与`==`的区别
文章目录
- 引言
- 什么是`==`操作符?
- 基本数据类型的比较
- 示例:
- 引用类型的比较
- 示例:
- 什么是`equals`方法?
- `equals`方法的默认实现
- 示例:
- 重写`equals`方法
- 示例:
- `equals`与`==`的区别
- 比较内容不同
- 示例:
- 使用场景不同
- 示例:
- 可重写性
- 示例:
- 实际应用示例
- 示例1:比较字符串
- 示例:
- 示例2:比较自定义对象
- 示例:
- 示例3:在集合中使用
- 示例:
- 总结

引言
在Java编程中,比较对象是一个常见的操作。equals
和==
是两种常用的比较方式,但它们的工作原理和应用场景有所不同。对于初学者来说,理解equals
与==
的区别,是编写正确和高效代码的关键一步。本篇文章将详细介绍equals
与==
的定义、用法及其区别,帮助你全面理解这些重要概念。
什么是==
操作符?
==
操作符用于比较两个变量是否指向同一个内存地址。它可以用于基本数据类型和引用类型的比较。
基本数据类型的比较
对于基本数据类型,==
比较的是它们的值。
示例:
public class PrimitiveComparison {public static void main(String[] args) {int a = 5;int b = 5;System.out.println(a == b); // 输出:true}
}
在上述示例中,a
和b
的值都是5
,所以a == b
返回true
。
引用类型的比较
对于引用类型,==
比较的是它们的内存地址,即是否指向同一个对象。
示例:
public class ReferenceComparison {public static void main(String[] args) {String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1 == str2); // 输出:false}
}
在上述示例中,str1
和str2
虽然内容相同,但它们指向不同的对象,所以str1 == str2
返回false
。
什么是equals
方法?
equals
方法是Object
类中的一个方法,用于比较两个对象的内容是否相同。所有类都继承自Object
类,因此所有类都有equals
方法。
equals
方法的默认实现
Object
类的equals
方法默认实现是比较对象的内存地址,等效于==
操作符。
示例:
public class DefaultEquals {public static void main(String[] args) {Object obj1 = new Object();Object obj2 = new Object();System.out.println(obj1.equals(obj2)); // 输出:false}
}
在上述示例中,obj1
和obj2
指向不同的对象,equals
方法返回false
。
重写equals
方法
为了比较对象的内容,通常需要在自定义类中重写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 && name.equals(person.name);}public static void main(String[] args) {Person p1 = new Person("Alice", 25);Person p2 = new Person("Alice", 25);System.out.println(p1.equals(p2)); // 输出:true}
}
在上述示例中,equals
方法被重写以比较Person
对象的内容,p1
和p2
的内容相同,所以p1.equals(p2)
返回true
。
equals
与==
的区别
比较内容不同
==
操作符:比较的是两个变量的内存地址,即是否指向同一个对象。equals
方法:比较的是两个对象的内容是否相同,需要在自定义类中重写以实现内容比较。
示例:
public class ComparisonExample {public static void main(String[] args) {String str1 = new String("Hello");String str2 = new String("Hello");System.out.println(str1 == str2); // 输出:falseSystem.out.println(str1.equals(str2)); // 输出:true}
}
在上述示例中,str1
和str2
的内存地址不同,但它们的内容相同,所以==
返回false
,而equals
返回true
。
使用场景不同
==
操作符:适用于基本数据类型的比较,以及需要判断两个引用类型变量是否指向同一个对象的情况。equals
方法:适用于比较引用类型变量的内容是否相同。
示例:
public class UsageExample {public static void main(String[] args) {int a = 5;int b = 5;System.out.println(a == b); // 输出:truePerson p1 = new Person("Alice", 25);Person p2 = new Person("Alice", 25);System.out.println(p1 == p2); // 输出:falseSystem.out.println(p1.equals(p2)); // 输出:true}
}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 && name.equals(person.name);}
}
可重写性
==
操作符:不能被重写,是Java语言的基础操作符。equals
方法:可以被重写,以实现自定义的内容比较逻辑。
示例:
public class OverridingExample {public static void main(String[] args) {Person p1 = new Person("Alice", 25);Person p2 = new Person("Alice", 25);System.out.println(p1.equals(p2)); // 输出:true}
}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 && name.equals(person.name);}
}
实际应用示例
示例1:比较字符串
字符串的比较在Java中是一个常见的操作,理解equals
与==
的区别非常重要。
示例:
public class StringComparison {public static void main(String[] args) {String str1 = "Hello";String str2 = "Hello";String str3 = new String("Hello");System.out.println(str1 == str2); // 输出:trueSystem.out.println(str1 == str3); // 输出:falseSystem.out.println(str1.equals(str3)); // 输出:true}
}
在上述示例中,str1
和str2
指向相同的字符串常量,所以==
返回true
。str1
和str3
虽然内容相同,但str3
是通过new
关键字创建的,指向不同的对象,所以==
返回false
,而equals
返回true
。
示例2:比较自定义对象
在自定义对象中,需要重写equals
方法以实现内容比较。
示例:
public class CustomObjectComparison {public static void main(String[] args) {Person p1 = new Person("Alice", 25);Person p2 = new Person("Alice", 25);System.out.println(p1 == p2); // 输出:falseSystem.out.println(p1.equals(p2)); // 输出:true}
}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 && name.equals(person.name);}
}
在上述示例中,equals
方法被重写以比较Person
对象的内容,p1
和p2
的内容相同,所以p1.equals(p2)
返回true
。
示例3:在集合中使用
在使用集合(如HashSet
、HashMap
等)时,理解equals
方法的重要性。
示例:
import java.util.HashSet;public class CollectionExample {public static voidmain(String[] args) {HashSet<Person> set = new HashSet<>();Person p1 = new Person("Alice", 25);Person p2 = new Person("Alice", 25);set.add(p1);set.add(p2);System.out.println(set.size()); // 输出:1}
}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 && name.equals(person.name);}@Overridepublic int hashCode() {int result = name.hashCode();result = 31 * result + age;return result;}
}
在上述示例中,Person
类重写了equals
和hashCode
方法,确保在集合中根据内容进行比较。即使p1
和p2
是不同的对象,但它们的内容相同,所以集合中只会保存一个实例。
总结
equals
和==
是Java编程中两个重要的比较方式,它们在比较内容、使用场景和可重写性等方面存在显著区别。通过本文的介绍,你应该对equals
与==
的定义、用法及其区别有了全面的了解。希望你在编程的学习过程中不断进步,成为一名出色的程序员!
相关文章:

【IT领域新生必看】Java编程中的神奇对比:深入理解`equals`与`==`的区别
文章目录 引言什么是操作符?基本数据类型的比较示例: 引用类型的比较示例: 什么是equals方法?equals方法的默认实现示例: 重写equals方法示例: equals与的区别比较内容不同示例: 使用场景不同示…...
WEBHTTP
目录 理解HTTP协议请求流程 1 1 Web基础 2 Hosts文件 1 1 2网页与HTML 2 HTML概述 1 1 3静态网页与动态网页 1.2HTTP协议 1 2 1 HTTP协议概述 1 2 2 HTTP方法 HTTP支持几种不同的请求命令,这些命令被称为HTTP方法(HTTP method 表1一3 HTTP方法 表1&#…...

nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题
一、问题描述 在做登录日志的时候想要获取客户端的ip, 网上查了一下 通过 req.headers[x-forwarded-for] || req.connection.remoteAddress; 获取, 结果获取了之后不管是开发环境,还是生产环境获取到的一直都是 127.0.0.1,这是因为在配置N…...

微软与OpenAI/谷歌与三星的AI交易受欧盟重点关注
近日,欧盟委员会主管竞争事务的副主席玛格丽特维斯塔格(Margrethe Vestager)在一次演讲中透露,欧盟反垄断监管机构将就微软与OpenAI的合作,以及谷歌与三星达成的AI协议寻求更多第三方意见。这意味着微软与 OpenAI、谷歌与三星的 AI 交易及合作…...

微信小程序毕业设计-学生实习与就业管理系统项目开发实战(附源码+论文)
大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…...

spring boot 接口参数解密和返回值加密
spring boot 接口参数解密和返回值加密 开发背景简介安装配置yml 方式Bean 方式 试一下启动项目返回值加密参数解密body 参数解密param和form-data参数解密 总结 开发背景 虽然使用 HTTPS 已经可以基本保证传输数据的安全性,但是很多国企、医疗、股票项目等仍然要求…...

C语言自定义类型——联合体、枚举
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、联合体(一)、联合体的声明(二)、联合体的特点(三)、联合体大小的计算!&a…...
【trition-server】pytorch 文档:使用 Triton 提供 Torch-TensorRT 模型
Serving a Torch-TensorRT model with Triton pytorch 的官方文档: Serving a Torch-TensorRT model with Triton 在有关机器学习基础设施的讨论中,优化和部署是密不可分的。一旦完成网络级优化以获得最大性能,下一步就是部署它。 然而,提供这种优化模型也有其自身的一系列…...
wps 表格如何实现vlookup高级模糊搜索
一、VLOOKUP 模糊搜索 在 WPS 表格中,可以通过使用 VLOOKUP 函数和通配符来实现高级模糊搜索。这里有一个具体的示例来帮助你理解如何进行这些操作。 示例:实现 VLOOKUP 高级模糊搜索 假设我们有以下数据集: AB产品编号产品名称001苹果00…...

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅
常识: 一般智能手机的额定工作电流大约为200mA Arduino Uno板上I/0(输入/输出)引脚最大输出电流为40 mA Uno板控制器总的输出电流为200 mA 点亮LED灯 发光二极管介绍 发光二极管(Light Emitting Diode,简称LED)是一种能够将电能转化为光能的固态的半导体器件…...

【C++题解】1561. 买木头
问题:1561. 买木头 类型:省赛、数组问题、二分答案、贪心、2015江苏省青少年信息学奥林匹克竞赛复赛 题目描述: 有 n 个木材供应商,每个供货商有长度相同一定数量的木头。长木头可以锯短,但短木头不能接长。有一个客…...
解决android native包webview,webview中的请求blocked by CORS policy
在stack overflow查,差不多查到的都是些webView.getSettings().setxxx,没用。在github上找别的类似的android native包webview运行pwa的项目,把它们的webView.getSettings().setxxx全搬过来,写了有一页多,一个有用的都…...

链篦机回转窑球团生产工艺
生球在回转窑氧化焙烧,回转窑头部设有燃烧器,燃料可以采用气体、固体、液体。 来自环冷机一冷却段的高温废气作为二次风进入窑内参与燃烧,烧成成品球进入环冷机。 环冷机采用鼓风冷却,热风风箱分为四段: 一段气体引至…...

查看电脑ip地址快捷键是什么?是哪个
在网络世界中,IP地址是每个网络设备的唯一标识,无论是我们的电脑、手机还是其他联网设备,都需要一个独特的IP地址来进行通讯。在日常生活和工作中,我们有时需要查看电脑的IP地址,以便进行网络设置、故障排查或远程连接…...
面试专区|【54道Spring Cloud高频题整理(附答案背诵版)】
什么是Spring Cloud? Spring Cloud是一个基于Spring Boot的开源框架,它提供了在分布式系统中集成各种服务治理功能的工具,如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态等。其主要目…...

Shopee(虾皮)怎么获取流量?
店铺流量的高低会直接关联到卖家店铺单量,也关系到一个店铺的营业情况和利润,那么Shopee的流量从哪里来呢? Shopee的平台流量可分为五个部分: 1.自然流量 2.关键字广告流量 3.平台活动流量 4.营销流量 5.粉丝流量 怎么提升…...

Java启动虚拟机默认字符集编码
-Dfile.encodingUTF-8 java程序启动默认字符集编码参数 // 这里会创建一个Charset.defaultCharset().name()的流,在Windows命令行窗口启动,会出现字符编码为GBK的情况 // 导致乱码输入、输出都会有影响 // 解决办法流的读取指定编码new InputStreamRead…...
【单片机编程模式】状态机编程
状态机编程是一种编程模式,它基于有限状态机(Finite State Machine,简称FSM)的概念。以下是状态机编程的清晰解释,分点表示和归纳: 基本概念: 状态机是一个有向图形,由一组节点&…...

IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢
由于VOS的普及性,不得不承认VOS确实是非常优秀的软交换,但是很多客户在使用过程中都会遇到各种安全问题,比如话费被盗用了,历史话单一堆的非法呼叫话单,严重的影响到了话务安全,并不是那点话费的事了&#…...
C++ STL容器:序列式容器-堆pirority_queue
摘要: CC STL(Standard Template Library,标准模板库)在C编程中的重要性不容忽视,STL提供了一系列容器、迭代器、算法和函数对象,这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)
要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况,可以通过以下几种方式模拟或触发: 1. 增加CPU负载 运行大量计算密集型任务,例如: 使用多线程循环执行复杂计算(如数学运算、加密解密等)。运行图…...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...

Razor编程中@Html的方法使用大全
文章目录 1. 基础HTML辅助方法1.1 Html.ActionLink()1.2 Html.RouteLink()1.3 Html.Display() / Html.DisplayFor()1.4 Html.Editor() / Html.EditorFor()1.5 Html.Label() / Html.LabelFor()1.6 Html.TextBox() / Html.TextBoxFor() 2. 表单相关辅助方法2.1 Html.BeginForm() …...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解
进来是需要留言的,先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码,输入的<>当成字符串处理回显到页面中,看来只是把用户输…...