==比较内存地址,equals比较字符串内容;==对引用类型只判断是否同一对象,equals逐字符比对且处理null安全;推荐"固定值".equals(变量)和objects.equals()避免空指针。

因为 == 比的是内存地址,equals 比的是字符串内容 —— 这不是习惯,而是 Java 对象模型决定的硬性规则。
== 只认“是不是同一个对象”
Java 中 == 对引用类型(包括 String)永远只判断两个变量是否指向堆或常量池中的同一块内存。哪怕内容一模一样,只要不是同一个对象,== 就返回 false。
- 字面量如
"abc"默认从字符串常量池复用,所以"abc" == "abc"是 true(但这是优化副作用,不可依赖) -
new String("abc")总是在堆中新建对象,跟常量池里的"abc"地址不同,==必为 false - 用户输入、JSON 解析、数据库查询返回的字符串,全是新创建的对象,
== "yes"几乎必然失败
equals 才真正比“长得一不一样”
String.equals() 是重写过的方法,它逐个字符比对内容,逻辑清晰可靠。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 内部已做 null 判断:传入 null 时返回 false,不会抛 NPE(但调用方为 null 会出问题)
- 推荐写成
"固定值".equals(变量),彻底避开变量为 null 的风险 - 区分大小写,符合默认语义;需要忽略大小写时,直接用
equalsIgnoreCase()
别自己转小写再比较
写 str.toLowerCase().equals(other.toLowerCase()) 看似可行,实际有隐患:
- 多一次字符串创建,性能开销明显
- 在某些 Locale(如土耳其语)下,
'i'和'I'的转换规则异常,结果可能出错 -
equalsIgnoreCase()底层已做 locale-aware 处理,更安全、更高效
Objects.equals() 是通用保险方案
当不确定变量类型、或可能为 null 且不想写冗长判空时,用 Objects.equals(a, b):
- 自动处理双方为 null、一方为 null、都不为 null 的所有情况
- 底层就是先判 null 再调用 equals,简洁又健壮
- 适合配置项校验、DTO 字段比对等泛化场景
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










