Java中==对基本类型比较值,对引用类型比较内存地址;基本类型隐式转换后比较,引用类型需用equals()比内容,包装类在[-128,127]缓存区可能==为true但不可依赖。

Java 中的 == 运算符对对象和数值的处理逻辑完全不同,关键在于它不做“统一语义”的值比较,而是严格按操作数类型切换行为:对基本类型比值,对引用类型比地址。
基本类型用 == 就是比数值大小
int、long、float、double、char、boolean 等基本类型变量,== 直接比较它们在栈中存储的实际值。类型不同时会先做隐式转换再比,比如 int a = 5; double b = 5.0;,a == b 结果为 true(a 被提升为 double 后比较)。
- 不需要重写,语言层面固定行为
- 比较速度快,无方法调用开销
- 注意浮点数精度问题:
0.1 + 0.2 == 0.3是 false
引用类型用 == 只看是不是同一个对象
String、User、ArrayList 等引用类型变量,== 比较的是它们在栈中保存的引用值——也就是堆中对象的内存地址。哪怕两个对象字段一模一样,只要不是同一块内存,结果就是 false。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
-
new String("a") == new String("a")→ false -
String s1 = "a"; String s2 = "a"; s1 == s2→ true(字符串常量池优化) - 常用于判断是否为同一实例,比如单例校验或 null 判断:
if (obj == null)
想比内容就得用 equals(),但得先确保它被正确重写
Object 类默认的 equals() 其实也等价于 ==,所以必须由具体类主动重写才能实现“内容相等”。String、Integer、LocalDateTime 等 JDK 类已重写;自定义类如 Person、Order 必须手动覆盖,并同步重写 hashCode()。
立即学习“Java免费学习笔记(深入)”;
- 重写时通常包含三步:引用自检(
this == obj)、null 和类型检查、字段逐个比较 - 涉及 null 字段要用
Objects.equals(a, b)避免空指针 - 作为 HashMap 的 key 或 HashSet 的元素时,
equals()和hashCode()必须保持一致
特殊情况:包装类的 == 有时也能“碰巧”对
Integer、Short、Byte、Character、Boolean 在 [-128, 127] 范围内会缓存对象,所以:
-
Integer a = 100; Integer b = 100; a == b→ true(复用同一对象) -
Integer c = 200; Integer d = 200; c == d→ false(各自新建) - 这种行为不可依赖,业务代码一律用
equals()判断值是否相等

















