尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Java基础:为什么两个String明明一样,使用==比较却是false?深入理解==和equals()区别
在学习 Java 的过程中和equals()几乎是每个初学者都会遇到的一个问题。很多刚开始学习 Java 的同学都会记住一句话String 比较不要使用 应该使用 equals()但是为什么为什么下面这段代码中两个 String 明明都是hello使用比较结果却是falsepublic class Main { public static void main(String[] args) { String s1 hello; String s2 new String(hello); System.out.println(s1 s2); System.out.println(s1.equals(s2)); } }运行结果false true这篇文章就来详细分析 Java 中和equals()的区别。一、Java中的到底比较什么在 Java 中的作用根据数据类型不同有所区别。1. 基本数据类型使用比较值例如public class Main { public static void main(String[] args) { int a 10; int b 10; System.out.println(a b); } }输出true因为对于基本数据类型intdoublefloatcharboolean比较的是变量中存储的具体值。2. 引用类型使用比较地址String 属于引用类型。例如String s1 new String(hello); String s2 new String(hello);这两个对象虽然内容一样hello但是它们实际上创建了两个不同的对象。可以理解为s1 --- String对象1(hello) s2 --- String对象2(hello)所以System.out.println(s1 s2);比较的是s1 和 s2 是否指向同一个对象答案是false因此对于引用类型 比较的是对象地址更准确地说是两个引用是否指向同一个对象二、equals()比较的是什么equals()是 Object 类中的方法。Java 中所有类默认都继承 Object。Object 类中的 equals 方法默认比较的是对象地址。源码大致如下public boolean equals(Object obj) { return this obj; }也就是说如果一个类没有重写 equals()那么它和 的效果基本一样。但是 String 重写了 equals() 方法。String 中的 equals() 比较的是两个字符串对象的内容是否相同例如String s1 new String(hello); String s2 new String(hello); System.out.println(s1.equals(s2));结果true虽然s1 s2是false但是s1.equals(s2)是true因为两个字符串的内容都是hello三、String常量池为什么会导致有时候是true很多同学看到下面代码会更加疑惑String a hello; String b hello; System.out.println(a b);结果true为什么不是说 String 使用 比较地址吗这里涉及 Java 的字符串常量池。什么是字符串常量池Java 为了提高字符串的复用效率设计了字符串常量池。当我们直接创建字符串String a hello;JVM 会先检查字符串常量池中是否已经存在hello。如果存在直接复用。如果不存在创建新的字符串对象并放入常量池。所以String a hello; String b hello;实际上可能是a \ --- hello b /两个引用指向同一个字符串对象。因此a b结果true四、为什么new String()会让变成false继续看String a hello; String b new String(hello); System.out.println(a b);结果false原因是new String()会强制创建一个新的对象。内存中类似字符串常量池 hello 堆 String对象 | --- hello虽然两个字符串内容一样但是对象不同。所以a b结果false五、String比较时为什么推荐使用equals()因为我们开发过程中大部分情况下想比较的是两个字符串的内容是否一样例如登录判断String username admin; if (username.equals(admin)) { System.out.println(登录成功); }我们关注的是username里面存储的文字是不是admin而不是username和admin是不是同一个对象。所以应该使用equals()六、equals()使用时还需要注意空指针问题下面代码String username null; System.out.println(username.equals(admin));运行会出现NullPointerException原因username本身是null没有对象可以调用equals()方法。更安全的写法System.out.println(admin.equals(username));因为admin一定不是null。即使username null;结果也只是false不会出现异常。实际开发中经常看到if (admin.equals(username)) { }就是为了避免空指针异常。七、Objects.equals()更加安全Java还提供了Objects.equals()用于安全比较两个对象。例如String a null; String b hello; System.out.println(Objects.equals(a, b));结果false它内部会帮助我们处理 null 情况。常用于Objects.equals(user.getName(), 张三)这种场景。八、和equals()区别总结比较方式比较内容基本数据类型 比较值引用类型 比较是否同一个对象Object.equals()默认比较地址String.equals()比较字符串内容简单记忆 问 是不是同一个对象 equals() 问 内容是不是一样九、实际开发中应该怎么选择如果比较 String推荐str1.equals(str2)或者更安全Objects.equals(str1, str2)不要写str1 str2因为你无法保证两个字符串一定来自同一个对象。总结刚开始学习 Java 的时候我一直把String比较用equals()当成一个需要背下来的规则。但是深入理解之后会发现它背后的原因其实很简单关注的是对象关系equals()关注的是内容关系所以以后遇到字符串比较问题不要先想“这个题是不是要求用 equals”而应该先问我现在想比较的是两个对象还是两个对象里面的数据理解这一点和equals()就不会再混淆了。如果你也是刚开始学习 Java建议把这些基础知识点真正弄懂。
RELATED

相关推荐

随身WiFi一到晚高峰就卡?先看懂QCI优先级,别急着怪设备

随身WiFi一到晚高峰就卡?先看懂QCI优先级,别急着怪设备

前排提醒:本文只讨论随身WiFi设备与流量卡的技术原理与使用研究,数据来自公开资料整理,不涉及任何具体渠道推荐。一个高频吐槽:白天测速满血,一到晚高峰就缩水;换台设备、换个卡槽,还是卡。不少…

📅 2026/10/15 2:22:46
aigc检测报告怎么看?2026年论文AI率免费检测和付费检测攻略,超标先降AI!

aigc检测报告怎么看?2026年论文AI率免费检测和付费检测攻略,超标先降AI!

论文写完了,查重率也降下来了,学校又要求提交AIGC检测报告。搜索一下,免费查AI率的网站、知网检测入口、降AI率软件混在一起:到底应该用哪个? 是不是每修改一次论文,都要重新花钱查AI率? 可以…

📅 2026/10/15 2:22:46
Flashlight Emoji 插件深度解析:从 `emoji grin` 到 `:rocket:` 的搜索与复制机制

Flashlight Emoji 插件深度解析:从 `emoji grin` 到 `:rocket:` 的搜索与复制机制

桌面应用插件系统 【免费下载链接】Flashlight The missing Spotlight plugin system 项目地址: https://gitcode.com/gh_mirrors/fl/Flashlight 点击查看 免费下载 导读 本文围绕 Flashlight(macOS Spotlight 插件系统)官方插件目录中的 E…

📅 2026/10/15 2:17:46
MORE NEWS

更多资讯

📰

企业微信API如何接入现有系统?接口层与业务层怎么划分

很多企业研发团队在初次对接企业微信 API 时,为了赶进度,习惯性地采用“直连模式”:在 Webhook 的接收函数里直接写 if-else 业务判断,甚至直接连上内部 CRM 的数据库执行 SQL。 这种“烟囱式”的强耦合代码,在初期或…

📰

Rope 模型加载失败终极指南:从报错定位到修复验证的完整教程

Rope 模型加载失败终极指南:从报错定位到修复验证的完整教程 【免费下载链接】Rope GUI-focused roop 项目地址: https://gitcode.com/GitHub_Trending/ro/Rope Rope 模型加载失败可能是你初装这个工具时最常碰上的问题——Rope 是一个基于 insightface insw…

📰

企业微信外部群机器人开发:群内@消息应该如何单独处理

在企业微信外部群的日常运营中,群聊环境极其嘈杂。如果你的机器人处于“全量监听”状态,群里每发一句闲聊,网关都会去查一次库或者请求一次大模型,不仅服务器的算力会瞬间被榨干,机器人还极易因为“乱插嘴”引发客户反…

📰

企业微信二次开发实战:如何把客户会话接入自己的业务后台

在私域流量的精细化运营时代,企业微信已经成为链接客户的标配触角。然而,真正的客户画像、历史工单、消费评级等核心资产,其实都沉淀在企业自有的 CRM 或 ERP 系统中。 如果仅仅停留在使用企微客户端打字聊天,或者使用粗糙的“直…

📰

大麦抢票脚本 5 分钟跑通指南:从 clone 到自动下单

大麦抢票脚本 5 分钟跑通指南:从 clone 到自动下单 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 热门演出开票几秒就售罄,手动刷新和点击总是慢人一…

📰

最新计算机毕业设计选题推荐-基于spring boot的美食配送平台-网站-文档指导-Java-springboot

✨作者主页:IT研究室✨ 个人简介:曾从事计算机专业培训教学,擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬