【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 大类 …...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)
CSI-2 协议详细解析 (一) 1. CSI-2层定义(CSI-2 Layer Definitions) 分层结构 :CSI-2协议分为6层: 物理层(PHY Layer) : 定义电气特性、时钟机制和传输介质(导线&#…...

2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...