基本数据类型只能用==比较,不能用equals(),因其非对象且无该方法;包装类等引用类型应优先用equals()比较内容,==仅比较内存地址。

基本数据类型只能用 ==,不能用 equals() —— 因为它们不是对象,没有方法可调用。
基本数据类型必须用 ==
Java 的 8 种基本类型(byte、short、int、long、float、double、char、boolean)直接存值,不占对象内存,也不在堆中创建实例。它们没有继承 Object 类,自然没有 equals() 方法。
-
int a = 5; int b = 5; →
a == b合法且正确,结果为 true - a.equals(b) → 编译报错:int 无法调用方法
- 包装类(如 Integer)是对象,可以用 equals(),但基本类型本身不行
引用类型慎用 ==,优先用 equals()
String、Integer、ArrayList 等引用类型变量存的是地址。== 比较的是两个变量是否指向堆中同一块内存,而 equals() 默认比较地址(Object 原生行为),但常用类已重写为比内容。
-
String s1 = "abc"; String s2 = "abc"; →
s1 == s2可能为 true(字符串常量池优化),但不可靠 -
String s3 = new String("abc"); String s4 = new String("abc"); →
s3 == s4一定为 false,s3.equals(s4)为 true - 自定义类若未重写 equals(),则
obj1.equals(obj2)等价于obj1 == obj2
面试常考陷阱点
考题常埋坑,注意这些高频雷区:
- 浮点数精度问题:0.1 + 0.2 == 0.3 结果是 false,这不是 equals 能解决的,需用 BigDecimal 或误差范围判断
- 自动装箱缓存:Integer i1 = 127; Integer i2 = 127; → i1 == i2 为 true;但 i1 = 128; i2 = 128; → i1 == i2 为 false(-128~127 缓存)
- null 安全:str.equals("test") 在 str 为 null 时抛 NullPointerException;推荐 "test".equals(str)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











