Java == 和 equals 区别

平时写Java代码时,新手最容易在“==”和equals上踩坑——明明按逻辑写的判断,结果却和预期不一样。比如你想判断两个“奶茶”是不是同一款,用不同的判断方式,结果天差地别。今天就用日常例子,把这两个概念讲透。

先搞懂“==”:最直接的“拿东西对比”

你可以把Java里的变量看成“贴了标签的盒子”,盒子里装的才是实际数据。“==”的作用,就是直接看两个标签“贴在同一个盒子上,还是不同盒子上”,不管盒子里装的是什么。

Java == 和 equals 区别

举个生活化例子:你手里有两杯珍珠奶茶,都放在桌上的同一个托盘里——相当于两个标签(变量)都指向同一个盒子(内存地址)。这时候用“==”判断,自然会得到“true”,因为标签贴在同一个盒子上。

但如果是两杯一模一样的奶茶,分别放在左边和右边的托盘里——相当于两个标签指向两个不同的盒子,只是盒子里的奶茶内容相同。这时候用“==”判断,就会得到“false”,因为两个标签没贴在同一个盒子上。

简单说:“==”对比的是两个变量的内存地址,看是不是同一个盒子,和盒子里装的东西无关。

再看equals:专门比“盒子里的东西”

equals方法的设计初衷,就是专门用来对比两个盒子里的内容是否一样,不用管是不是同一个盒子。

还是拿奶茶举例:你点了两杯一模一样的珍珠奶茶,虽然是两个不同的托盘(不同内存地址),但两杯奶茶的配料(茶底、糖度、珍珠数量)完全相同——这时候用equals判断,就会得到“true”,因为它只看盒子里的内容。

不过这里有个重要前提:equals方法不是天生就会比内容,它是Object类自带的一个“模板方法”。如果是你自己写的类,比如你做了一个“奶茶杯”的类,里面有糖度、茶底这些属性,要是没重写equals,那它就会沿用Object里的逻辑,和“==”完全一样,只比地址。

举个新手常踩的坑:用String类的时候,为什么"new String("珍珠奶茶")"和"珍珠奶茶"用equals判断是true?因为Java已经给String类重写了equals,让它对比的是字符串的实际内容,而不是内存地址。这时候要是你用"new String("a") == new String("a")",结果就是false,因为两个new出来的字符串是不同的内存盒子,equals才会返回true。

总结:什么时候用哪个?

如果只是对比基本数据类型(比如int、boolean),它们的变量本身就是装的数值,没有盒子的区别,直接用“==”就行,比如判断两个年龄是否相同。

如果是对比对象类型(比如字符串、自定义的奶茶类),想知道它们的内容是不是一样,就用equals;要是想确认是不是同一个对象(同一个盒子),才用“==”。

下次写代码前,先想清楚你要比“标签贴没贴同一个盒子”,还是“盒子里的东西一样”,就能避开大部分坑了。

上一篇 Java Object 常用方法有哪些