java相等判断分基本类型和引用类型:基本类型用==比值,引用类型用==比地址、equals()比内容(需重写);包装类比较值应统一用equals()。

Java 中的相等判断,关键看操作数类型:基本类型用 == 比值;对象类型用 == 比地址、用 equals() 比内容——但前提是该类重写了 equals()。
基本数据类型只能用 ==
byte、short、int、long、float、double、char、boolean 这 8 种类型,变量直接存值,没有方法可调用。
所以它们之间只能用 == 判断数值是否相等,不能调用 equals()(编译不通过)。
-
int a = 5; int b = 5;→a == b返回 true -
float f1 = 0.1f; double d1 = 0.1;→f1 == d1很可能为 false(精度丢失),应改用误差范围比较
引用类型用 == 判断是否是同一个对象
String、Integer、ArrayList 等都是类,变量存储的是堆中对象的地址。
== 对它们来说,只看两个引用是否指向同一块内存,和内容无关。
-
String s1 = new String("abc"); String s2 = new String("abc");→s1 == s2是 false -
String s3 = s1;→s1 == s3是 true(同一地址) - 注意:字符串字面量如
"abc"会进常量池,String s4 = "abc"; String s5 = "abc";时s4 == s5可能为 true,但这属于 JVM 优化,不是通用规则
引用类型用 equals() 判断内容是否相同
equals() 是 Object 类的方法,所有对象都有。它的默认行为和 == 一样(比地址),但很多常用类已重写:
-
String:逐字符比较内容(区分大小写) -
Integer、Boolean等包装类:比较包装的原始值(自动拆箱) -
List、Map:递归调用元素或键值对的 equals() - 自定义类若需按字段判断相等,必须重写 equals()(同时建议重写 hashCode())
⚠️ 使用前务必检查 null:obj != null && obj.equals(other) 或更安全地用 Objects.equals(obj, other)(自动处理 null)。
包装类比较要特别小心 ==
Integer、Long、Boolean 等有缓存机制(如 Integer 默认缓存 -128 ~ 127):
-
Integer i1 = 100; Integer i2 = 100;→i1 == i2是 true(复用缓存对象) -
Integer i3 = 200; Integer i4 = 200;→i3 == i4是 false(新建对象) - 因此,包装类之间比较值,统一用
equals()更可靠
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











