java中==对基本类型比较值,对引用类型比较内存地址;基本类型直接比数值,引用类型只判断是否指向同一对象实例,与内容无关。

Java 中 == 运算符的比较行为完全取决于操作数的类型:对基本数据类型比“值”,对引用类型比“地址”——这是它最核心、最不可绕开的规则。
基本数据类型:直接比数值大小
当两边都是基本类型(如 int、double、char、boolean 等)时,== 检查它们在栈中存储的实际值是否相等。
-
int a = 5; int b = 5;→a == b为 true,因为两个变量都存着整数 5 -
double x = 0.1 + 0.2; double y = 0.3;→x == y很可能为 false,浮点数精度问题导致值不严格相等 -
char c1 = 'A'; char c2 = 65;→c1 == c2为 true,因为字符 'A' 的 Unicode 值就是 65,本质仍是数值比较
引用类型:只看是否指向同一块内存
当两边是对象(如 String、ArrayList、自定义类实例等)时,== 不关心内容,只判断两个引用变量是否指向堆中**同一个对象实例**。
-
String s1 = new String("hello"); String s2 = new String("hello");→s1 == s2为 false,虽然内容一样,但创建了两个独立对象,地址不同 -
String s3 = s1;→s1 == s3为 true,因为 s3 只是把 s1 的引用(地址)复制了一份,两者指向同一对象 -
Integer a = 127; Integer b = 127;→a == b可能为 true(因 Integer 缓存机制),但Integer a = 128; Integer b = 128;→a == b通常为 false;这正说明==看的是地址,不是值
常见误区提醒
别被表象带偏:
-
String s1 = "abc"; String s2 = "abc";→s1 == s2是 true,但这不是因为字符串内容相同,而是因为字面量字符串被放入字符串常量池,s1 和 s2 实际引用的是池中同一个对象 -
==不能用于比较null和基本类型(编译报错),但可以安全比较引用是否为null:如obj == null -
equals()是方法,只能用于引用类型;基本类型没有equals(),也不能用==去调用方法
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











