Java里==和.equals()到底啥区别?

​导语:​​ 刚刚开始学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")则​​强制​​在堆内存创建一个​​新对象​​(新地址),即使内容一样。
  • 所以s1s3可能指向常量池同一个地址,所以==true。​​但是!比较字符串是否相等,永远应该使用.equals()!不要依赖==!​​ 因为常量池行为有时不可预测,用new创建的一定是新对象地址。

​核心结论:对于String,==比较地址,.equals()比较内容。比较字符串内容永远用.equals()!​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值