0

0

equals与==的区别_对象引用比较与内容比较的本质

P粉602998670

P粉602998670

发布时间:2026-02-12 11:19:02

|

900人浏览过

|

来源于php中文网

原创

== 比较对象引用是否相同(内存地址),equals 比较逻辑内容是否相等;String 等类重写了 equals 以比较字符序列,而 == 在字符串常量池与 new 创建对象时结果不可靠。

equals与==的区别_对象引用比较与内容比较的本质

Java 中 equals== 判等结果不一致,到底在比什么

根本区别不在“要不要重写”,而在比较目标不同:== 比的是内存地址(引用是否指向同一对象),equals 默认行为也是比地址,但设计初衷是留给子类覆盖、用来比逻辑相等——比如两个 String 内容一样就该算相等,哪怕不是同一个实例。

常见错误现象:用 == 判断两个新创建的 String 是否“内容相同”,结果是 false;或对自定义类没重写 equals 就直接调用,误以为它会自动比较字段值。

  • == 是运算符,编译期绑定,无法被重载,永远只看引用是否相同
  • equalsObject 的实例方法,可被重写,实际行为取决于运行时对象类型
  • 基本类型(如 intboolean)只能用 ==,没有 equals 方法(包装类才有)

String 为什么用 equals 而不用 ==

因为字符串常量池和对象创建方式导致引用不可靠。字面量 "abc" 会进池,但 new String("abc") 一定新建堆对象,两者 == 必为 false,但内容完全一致。

示例:

String a = "hello";
String b = "hello";
String c = new String("hello");
System.out.println(a == b);     // true(同池中引用)
System.out.println(a == c);     // false(堆中新对象)
System.out.println(a.equals(c)); // true(重写了,比字符序列)
  • 不要依赖字符串常量池做判等依据,它受编译器优化、intern() 调用等影响
  • 所有字符串内容比较必须用 equals,包括与 null 比较前要先判空,否则可能抛 NullPointerException
  • 如果确定是字面量且无运行时拼接,== 可能快一点,但语义错位,不值得冒险

自定义类忘记重写 equals 的后果

直接继承 Object.equals,等价于 ==,两个字段完全相同的对象仍被判为不等——集合操作(如 HashSet.containsHashMap.get)全失效。

名品购物网店系统
名品购物网店系统

适合品牌专卖店专用,从前台的美工设计就开始强调视觉形象,有助于提升商品的档次,打造网店品牌!后台及程序核心比较简洁,着重在线购物,去掉了繁琐的代码及垃圾程式,在结构上更适合一些中高档的时尚品牌商品展示. 率先引入语言包机制,可在1小时内制作出任何语言版本,程序所有应用文字皆引自LANG目录下的语言包文件,独特的套图更换功能,三级物品分类,购物车帖心设计,在国内率先将购物车与商品显示页面完美结合,完

下载

典型场景:用 Person 对象作 Map 的 key,或放进 ArrayList 后用 contains 查找,结果找不到。

  • 重写 equals 必须同时重写 hashCode,否则违反契约,哈希容器行为未定义
  • 判断逻辑要覆盖所有业务上认为“相等”的字段,忽略无关状态(如临时缓存、创建时间)
  • 注意 null 安全:用 Objects.equals(field1, field2) 替代手动判空 + 比较

性能与兼容性:什么时候 == 反而更合理

当明确只需要确认“是不是同一个对象”时,== 更快、更安全。比如单例校验、事件监听器去重、缓存 key 的快速预检。

示例:

if (listener == this) return; // 避免重复注册自己
  • == 是零成本比较,equals 至少有一次虚方法调用 + 字段读取开销
  • 某些框架内部(如 Hibernate 代理对象)重写 equals 会触发懒加载,用 == 可规避副作用
  • 跨 JVM 或序列化后对象,引用关系已丢失,== 失效,此时只能依赖 equals 逻辑

最易被忽略的点:很多人以为“重写了 equals 就万事大吉”,但没意识到 == 在某些边界场景下才是语义正确且高效的选择——关键不是哪个“更好”,而是你此刻想表达的,究竟是身份一致,还是内容一致。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
hibernate和mybatis有哪些区别
hibernate和mybatis有哪些区别

hibernate和mybatis的区别:1、实现方式;2、性能;3、对象管理的对比;4、缓存机制。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

152

2024.02.23

Hibernate框架介绍
Hibernate框架介绍

本专题整合了hibernate框架相关内容,阅读专题下面的文章了解更多详细内容。

88

2025.08.06

Java Hibernate框架
Java Hibernate框架

本专题聚焦 Java 主流 ORM 框架 Hibernate 的学习与应用,系统讲解对象关系映射、实体类与表映射、HQL 查询、事务管理、缓存机制与性能优化。通过电商平台、企业管理系统和博客项目等实战案例,帮助学员掌握 Hibernate 在持久层开发中的核心技能。

39

2025.09.02

Hibernate框架搭建
Hibernate框架搭建

本专题整合了Hibernate框架用法,阅读专题下面的文章了解更多详细内容。

69

2025.10.14

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

688

2023.08.02

java中boolean的用法
java中boolean的用法

在Java中,boolean是一种基本数据类型,它只有两个可能的值:true和false。boolean类型经常用于条件测试,比如进行比较或者检查某个条件是否满足。想了解更多java中boolean的相关内容,可以阅读本专题下面的文章。

358

2023.11.13

java boolean类型
java boolean类型

本专题整合了java中boolean类型相关教程,阅读专题下面的文章了解更多详细内容。

36

2025.11.30

c语言中null和NULL的区别
c语言中null和NULL的区别

c语言中null和NULL的区别是:null是C语言中的一个宏定义,通常用来表示一个空指针,可以用于初始化指针变量,或者在条件语句中判断指针是否为空;NULL是C语言中的一个预定义常量,通常用来表示一个空值,用于表示一个空的指针、空的指针数组或者空的结构体指针。

243

2023.09.22

2026春节习俗大全
2026春节习俗大全

本专题整合了2026春节习俗大全,阅读专题下面的文章了解更多详细内容。

189

2026.02.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号