news 2026/6/10 21:02:17

【Java避坑】为什么我的 String a == b 返回 false?一文搞懂 Java 中的 == 与 equals

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【Java避坑】为什么我的 String a == b 返回 false?一文搞懂 Java 中的 == 与 equals

你是不是也遇到过这种情况?明明两个字符串的内容一模一样,用if (str1 == str2)判断时,程序却无情地走进了else分支。

作为一个 Java 新手,这个问题曾困扰了我很久。今天我们来扒一扒这背后的原理,保证你看完后再也不会写错!

1. 案发现场

先看一段简单的代码:

String str1 = new String("hello"); String str2 = new String("hello"); if (str1 == str2) { System.out.println("它俩是一样的!"); } else { System.out.println("它俩不一样!"); // 结果竟然打印了这行? }

按照我们的直觉,str1str2都是 "hello",应该一样才对。为什么 Java 告诉我它们不一样?

2. 真相:你在比“地址”还是在比“长相”?

在 Java 的世界里,比较东西分两种情况。

A. == 操作符:比较的是“地址” (内存地址)

这就好比在问:“你们拿的是不是同一把家门钥匙?”

在上面的代码中,我们用了 new 关键字。new 的意思是在内存堆(Heap)里开辟一块新地盘。

  • str1住在一个地址(比如 0x111)。

  • str2 住在另一个地址(比如 0x222)。

    虽然它们房子里装修得一模一样,但它们是两栋不同的房子!所以 == 返回 false。

B. equals() 方法:比较的是“内容” (逻辑值)

这就好比在问:“你们的房子装修是不是一样的?”

如果我们换成 equals:

if (str1.equals(str2)) { System.out.println("它俩内容一样!"); // 打印这行 }

String类重写了equals方法,它会逐个字符去比较。只要字面一样,就返回true

3. 特殊情况:字符串常量池 (String Pool)

这里有个坑。如果你不用new,而是这样写:

String s1 = "hello"; String s2 = "hello"; System.out.println(s1 == s2); // 这里竟然是 true!

这是因为 Java 为了省内存,做了一个优化。当你直接写 "hello" 时,Java 会先去“字符串常量池”找有没有这个字。如果有,直接把地址给你;如果没有,才创建一个。

所以这里 s1 和 s2 确实拿的是同一把钥匙。

但千万别依赖这个!在实际开发中,数据往往是从数据库或者网络传来的,你无法保证它们在常量池里。

4. 总结与最佳实践

为了避免半夜调 Bug,请记住这条铁律:

在 Java 中,比较基本数据类型(int, boolean 等)用 ==;

比较对象(String, Integer, 自定义对象),永远使用 .equals()!


小技巧 (Pro Tip):

为了防止空指针异常(NullPointerException),建议把常量写在前面:

  • ❌ 坏习惯:if (userStatus.equals("ACTIVE"))(如果 userStatus 是 null,程序会崩)

  • ✅ 好习惯:if ("ACTIVE".equals(userStatus))(安全!)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 21:59:16

刷题日记day4(搜索)

第一篇题解 蒟蒻的第四篇题解希望大家支持 题目描述 P3915树的分解 P3915 树的分解 题目描述 给出 NNN 个点的树和 KKK,问能否把树划分成 NK\frac{N}{K}KN​ 个连通块,且每个连通块的点数都是 KKK。 输入格式 第一行,一个整数 TTT&am…

作者头像 李华
网站建设 2026/6/10 12:33:39

【收藏】GPT-5.2来袭!OpenAI最新最强大模型全解析,程序员必学

OpenAI为应对谷歌Gemini系列竞争压力,发布迄今最强大的GPT-5.2模型,包含Instant、Thinking和Pro三个版本,性能较前代有巨大提升。API、Codex已更新,Cursor等第三方工具已支持。作者已将OpenAI产品切换至GPT-5.2,并计划…

作者头像 李华
网站建设 2026/6/10 18:12:44

【必读收藏】2025年扩散模型全领域变革:从架构到应用的深度解析

2025年扩散模型正经历从U-Net到DiT(Transformer)架构的重大转变,引发可控生成、图像编辑和主体定制化等领域的创新与挑战。ControlNet面临算力瓶颈,OmniControl等高效方案兴起;图像编辑向基于指令的方法演进;主体定制化因架构变化…

作者头像 李华
网站建设 2026/6/10 2:30:50

003-RSA魔改:一号店

本文案例网站:一号店 定位加密参数 打开网页输入账号密码,抓包后发现账号密码都加密了: 下面的参数对比发现不变,我们直接搜索关键字: 账号密码都在这里,大概率就在这里前后都打上断点: 断下来…

作者头像 李华
网站建设 2026/6/10 12:28:28

Day 36 官方文档的阅读

浙大疏锦行 官方文档的检索方式:GitHub和官网 官方文档的阅读和使用:要求安装的包和文档为同一个版本 类的关注点: a.实例化所需要的参数 b.普通方法所需要的参数 c.普通方法的返回值 绘图的理解:对底层库的调用 import p…

作者头像 李华
网站建设 2026/6/10 19:50:40

基于协同过滤的旅游酒店和订餐系统设计与实现

基于协同过滤的旅游酒店和订餐系统设计与实现 一.系统概述本系统旨在为用户提供一个智能化的旅游酒店和餐饮推荐平台,结合用户偏好、行为数据以及协同过滤算法,实现个性化的推荐功能。用户可以通过注册登录进行操作,使用该平台搜索和预定酒店…

作者头像 李华