导语: 刚刚开始学Java,被==和.equals()搞得头晕眼花?明明名字都是"张三",为什么==说它俩不是一个人,.equals()又说它俩是一个人?今天我就把我踩过的坑、查过的资料、理解的心得,用最直白的话跟大家分享一下!面试官也爱问这个,赶紧学起来吧!
🌈 核心一句话区别(先记住这个!)
-
==(操作符): 检查两个引用(指向对象的内存地址)是不是指向内存中的同一个对象,或者检查两个基本数据类型**的值是否相等。 -
.equals()(方法): 检查两个对象**的内容(值)是否相等(但这个“内容相等”的具体含义要看这个方法是如何被实现的!默认实现比较地址!)。
关键: 什么时候用==,什么时候用.equals(),很大程度上取决于你在比较什么东西!下面我们来深入剖析。
场景一:比较基本数据类型 (int, char, double, boolean等)
== 完胜,它直接比较两个变量的值是否相等。

.equals() 在这里不能用!因为基本数据类型不是对象,它们没有方法。
场景二:比较引用数据类型 (类创建的对象,如String, 自定义的Person类,数组等)
这才是==和.equals()区别的核心战场!
==的作用 - 只认“身份证号”(内存地址)
== 只看两个变量(引用)指向的是不是内存中同一个具体的对象(想象成同一间房子)。

.equals()的作用 - 看“内容”(值),但规则可变!
.equals() 定义在Object类(所有类的超类)中。它的默认实现(如果你没有在你的类里重写它)是:return (this == obj); 也就是用==来比较地址!这和你想比较内容的本意可能不符!
我们通常希望两个"张三"对象是.equals()相等的!这就需要我们重写(Override).equals()`方法!
特例重点!String类!最容易混淆的点!
String类重写了.equals()`方法,让它比较的是字符串的内容(每个字符是不是都一样)!
为什么String s1 = "hello"; String s2 = "hello";用==可能是true?
- 这是因为Java的字符串常量池(JVM的一个特殊区域)优化机制!
- 字面量方式创建的相同字符串 (
"hello"),JVM会尽量复用常量池中的同一个字符串对象(相同地址)。 - 而
new String("hello")则强制在堆内存创建一个新对象(新地址),即使内容一样。 - 所以
s1和s3可能指向常量池同一个地址,所以==为true。但是!比较字符串是否相等,永远应该使用.equals()!不要依赖==! 因为常量池行为有时不可预测,用new创建的一定是新对象地址。
核心结论:对于String,==比较地址,.equals()比较内容。比较字符串内容永远用.equals()!

1342

被折叠的 条评论
为什么被折叠?



