当前位置: 首页 > news >正文

【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}
}

在上述示例中,ab的值都是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}
}

在上述示例中,str1str2虽然内容相同,但它们指向不同的对象,所以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}
}

在上述示例中,obj1obj2指向不同的对象,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对象的内容,p1p2的内容相同,所以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}
}

在上述示例中,str1str2的内存地址不同,但它们的内容相同,所以==返回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}
}

在上述示例中,str1str2指向相同的字符串常量,所以==返回truestr1str3虽然内容相同,但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对象的内容,p1p2的内容相同,所以p1.equals(p2)返回true

示例3:在集合中使用

在使用集合(如HashSetHashMap等)时,理解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类重写了equalshashCode方法,确保在集合中根据内容进行比较。即使p1p2是不同的对象,但它们的内容相同,所以集合中只会保存一个实例。

总结

equals==是Java编程中两个重要的比较方式,它们在比较内容、使用场景和可重写性等方面存在显著区别。通过本文的介绍,你应该对equals==的定义、用法及其区别有了全面的了解。希望你在编程的学习过程中不断进步,成为一名出色的程序员!

相关文章:

【IT领域新生必看】Java编程中的神奇对比:深入理解`equals`与`==`的区别

文章目录 引言什么是操作符&#xff1f;基本数据类型的比较示例&#xff1a; 引用类型的比较示例&#xff1a; 什么是equals方法&#xff1f;equals方法的默认实现示例&#xff1a; 重写equals方法示例&#xff1a; equals与的区别比较内容不同示例&#xff1a; 使用场景不同示…...

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支持几种不同的请求命令&#xff0c;这些命令被称为HTTP方法(HTTP method 表1一3 HTTP方法 表1&#…...

nodejs 获取客服端ip,以及获取ip一直都是127.0.0.1的问题

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

微软与OpenAI/谷歌与三星的AI交易受欧盟重点关注

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

微信小程序毕业设计-学生实习与就业管理系统项目开发实战(附源码+论文)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;微信小程序毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计…...

spring boot 接口参数解密和返回值加密

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

C语言自定义类型——联合体、枚举

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、联合体&#xff08;一&#xff09;、联合体的声明&#xff08;二&#xff09;、联合体的特点&#xff08;三&#xff09;、联合体大小的计算&#xff01;&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 表格中&#xff0c;可以通过使用 VLOOKUP 函数和通配符来实现高级模糊搜索。这里有一个具体的示例来帮助你理解如何进行这些操作。 示例&#xff1a;实现 VLOOKUP 高级模糊搜索 假设我们有以下数据集&#xff1a; AB产品编号产品名称001苹果00…...

第一天(点亮led灯+led灯闪烁)——Arduino uno R3 学习之旅

​ 常识: 一般智能手机的额定工作电流大约为200mA Arduino Uno板上I/0(输入/输出)引脚最大输出电流为40 mA Uno板控制器总的输出电流为200 mA 点亮LED灯 发光二极管介绍 发光二极管(Light Emitting Diode&#xff0c;简称LED)是一种能够将电能转化为光能的固态的半导体器件…...

【C++题解】1561. 买木头

问题&#xff1a;1561. 买木头 类型&#xff1a;省赛、数组问题、二分答案、贪心、2015江苏省青少年信息学奥林匹克竞赛复赛 题目描述&#xff1a; 有 n 个木材供应商&#xff0c;每个供货商有长度相同一定数量的木头。长木头可以锯短&#xff0c;但短木头不能接长。有一个客…...

解决android native包webview,webview中的请求blocked by CORS policy

在stack overflow查&#xff0c;差不多查到的都是些webView.getSettings().setxxx&#xff0c;没用。在github上找别的类似的android native包webview运行pwa的项目&#xff0c;把它们的webView.getSettings().setxxx全搬过来&#xff0c;写了有一页多&#xff0c;一个有用的都…...

链篦机回转窑球团生产工艺

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

查看电脑ip地址快捷键是什么?是哪个

在网络世界中&#xff0c;IP地址是每个网络设备的唯一标识&#xff0c;无论是我们的电脑、手机还是其他联网设备&#xff0c;都需要一个独特的IP地址来进行通讯。在日常生活和工作中&#xff0c;我们有时需要查看电脑的IP地址&#xff0c;以便进行网络设置、故障排查或远程连接…...

面试专区|【54道Spring Cloud高频题整理(附答案背诵版)】

什么是Spring Cloud&#xff1f; Spring Cloud是一个基于Spring Boot的开源框架&#xff0c;它提供了在分布式系统中集成各种服务治理功能的工具&#xff0c;如配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态等。其主要目…...

Shopee(虾皮)怎么获取流量?

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

Java启动虚拟机默认字符集编码

-Dfile.encodingUTF-8 java程序启动默认字符集编码参数 // 这里会创建一个Charset.defaultCharset().name()的流&#xff0c;在Windows命令行窗口启动&#xff0c;会出现字符编码为GBK的情况 // 导致乱码输入、输出都会有影响 // 解决办法流的读取指定编码new InputStreamRead…...

【单片机编程模式】状态机编程

状态机编程是一种编程模式&#xff0c;它基于有限状态机&#xff08;Finite State Machine&#xff0c;简称FSM&#xff09;的概念。以下是状态机编程的清晰解释&#xff0c;分点表示和归纳&#xff1a; 基本概念&#xff1a; 状态机是一个有向图形&#xff0c;由一组节点&…...

IPSS模块怎么安装到VOS服务器的,到底有没有效果,是不是能大幅度提升VOS3000安全性呢

由于VOS的普及性&#xff0c;不得不承认VOS确实是非常优秀的软交换&#xff0c;但是很多客户在使用过程中都会遇到各种安全问题&#xff0c;比如话费被盗用了&#xff0c;历史话单一堆的非法呼叫话单&#xff0c;严重的影响到了话务安全&#xff0c;并不是那点话费的事了&#…...

C++ STL容器:序列式容器-堆pirority_queue

摘要&#xff1a; CC STL&#xff08;Standard Template Library&#xff0c;标准模板库&#xff09;在C编程中的重要性不容忽视&#xff0c;STL提供了一系列容器、迭代器、算法和函数对象&#xff0c;这些组件极大地提高了C程序的开发效率和代码质量。 STL 容器 分为 2 大类 …...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战&#xff1a;腾讯云IM群组成员管理&#xff08;增删改查&#xff09; 一、前言 在社交类App开发中&#xff0c;群组成员管理是核心功能之一。本文将基于UniApp框架&#xff0c;结合腾讯云IM SDK&#xff0c;详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

【服务器压力测试】本地PC电脑作为服务器运行时出现卡顿和资源紧张(Windows/Linux)

要让本地PC电脑作为服务器运行时出现卡顿和资源紧张的情况&#xff0c;可以通过以下几种方式模拟或触发&#xff1a; 1. 增加CPU负载 运行大量计算密集型任务&#xff0c;例如&#xff1a; 使用多线程循环执行复杂计算&#xff08;如数学运算、加密解密等&#xff09;。运行图…...

Element Plus 表单(el-form)中关于正整数输入的校验规则

目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入&#xff08;联动&#xff09;2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

Go 语言并发编程基础:无缓冲与有缓冲通道

在上一章节中&#xff0c;我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道&#xff0c;它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好&#xff0…...

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&#xff1a;通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分&#xff0c;设置 Gradle JDK 方法2&#xff1a;通过 Settings File → Settings... (或 CtrlAltS)…...

渗透实战PortSwigger靶场:lab13存储型DOM XSS详解

进来是需要留言的&#xff0c;先用做简单的 html 标签测试 发现面的</h1>不见了 数据包中找到了一个loadCommentsWithVulnerableEscapeHtml.js 他是把用户输入的<>进行 html 编码&#xff0c;输入的<>当成字符串处理回显到页面中&#xff0c;看来只是把用户输…...