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

【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))(安全!)

http://www.jsqmd.com/news/79207/

相关文章:

  • 教程 30 - 纹理系统
  • 【题解】Luogu P1310 [NOIP 2011 普及组] 表达式的值
  • Java面试三连击:原理拆解+实战避坑
  • 【题解】Luogu P11854 [CSP-J2022 山东] 宴会
  • Stack
  • 深入Ascend C(四):多算子融合与图级优化实战——构建高性能Attention自定义Kernel
  • 【题解】Luogu P5322 [BJOI2019] 排兵布阵
  • 代码源挑战赛 Round 41
  • 详细介绍:NumPy / pandas 类型选型、内存占用与性能优化
  • 告别选择困难!2025年远程控制软件场景化终极横评
  • 一种可落地的任务令牌锁机制:设计原理、实战经验与容器化演进
  • [JSK]二叉苹果树
  • 【题解】Luogu P8137 [ICPC2020 WF] ’S No Problem
  • Day 36 官方文档的阅读
  • 青少年编程学习:考级与竞赛如何平衡
  • 2025 Autel MaxiVCI V150 Wireless Dongle: CAN FD/DOIP for Autel 900 Series Scanners
  • 【UI Qt】入门笔记
  • WSL安装方法
  • Ubuntu环境中LLaMA Factory 的部署与配置—构建大语言模型微调平台 - 实践
  • 2025贵阳公墓/公益公墓top5推荐!贵阳优质生态陵园榜单发布,合规保障与人文关怀兼具的安息之所推荐 - 全局中转站
  • 【题解】Luogu P2354 [NOI2014] 随机数生成器
  • 基于Django的农场管理系统
  • rsync交叉编译步骤
  • 下载UCI数据集《Secondary Mushroom》
  • 【题解】P11453 [USACO24DEC] Deforestation S
  • 03 以上版本 Excel 文件解压替换图片
  • 【题解】Luogu P13977 数列分块入门 2
  • AI核心知识50——大语言模型之Scaling Laws(简洁且通俗易懂版)
  • MySQL 深分页查询优化实践与经验总结
  • P2014 [CTSC1997] 选课