千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Java中equals与==有什么区别?

Java中equals与==有什么区别?

来源:千锋教育
发布人:wjy
时间: 2022-07-01 17:36:00 1656668160

  对于这种常规性的面试题目,我们应该回答出与别人不一样的地方,才能给面试官留下足够好的印象。

  接下来 壹哥 会从以下几个维度来阐述这个问题:

  两者性质不同

  两者比较的角度不同

  比较速度不同

  底层实现不同

  附加答案

  1. 两者性质不同

  首先我们要搞清楚,"==" 是Java里的一个 二元操作运算符,用于比较基本类型和对象,而 equals()是类中的一个方法,用于检查两个对象内容的相等性。

  说到方法,我们要再明确一点,equals()到底是谁的方法?

  一般来说,equals()指的都是超类Object中的方法。但在二般情况下,equals()也可能是Object的某个子类的方法,比如String、Integer、Long等子类中也有equals()方法。Object类中的equals()方法与String类中的equals()方法内部实现就不一样!

  2. 两者比较的角度不同

  一般情况下,equals()方法用来比较两个对象的内容是否相同。比如下面的代码:

Java中equals与==有什么区别1

  上面代码中,s1与s2是两个完全不同的对象,引用地址肯定不同,但是s1与s2里的字符串内容是相同的,所以s1.equals(s2)的结果为true!

  stu01与stu02也是两个完全不同的Student类对象,但是两个对象的内容相同,所以stu01.equals(stu02)的结果也是true;而stu03.equals(stu04)的结果则为false,因为stu03与stu04两个对象里的内容不同!

  而对于 "==" 操作符来说,应该分为两种情况来讨论,即比较基本数据类型和比较引用类型,具体如下:

  (1). 基本数据类型:比较的是两个基本数据类型的值是否相等,比如两个整型值是否相等。

  (2). 引用数据类型:比较的是两个引用对象的引用地址是否一样,比如说新建了两个对象,比较的是两个对象的引用地址是否一样。

 

Java中equals与==有什么区别2

  上面的代码中,stu01==stu02的结果为false,s3 == s4的结果也为false,因为彼此两个对象都是不同的对象,引用地址不一样。

  3. 比较速度不同

  equals()方法的比较速度没有 "==" 运行速度快,因为 "==" 只是比较两个对象的引用地址是否一样。

  4. 底层实现不同

  如果你可以回答出上面的这些内容,已经可以得到80分了。但是到此为止,我们其实还没有回答出深层次的内容,所谓深层次的内容,就是支持我们得出上面结论的依据在哪里。所以我们可以继续扩展回答一下,跟面试官聊聊底层源码的实现。

  我在上面说过,对于equals()方法,首先应该明确到底是谁的equals()方法,是Object类的equals()方法,还是String类的equals()方法?搞清楚这个很重要!

  我们先来看看Object类中equals()方法的源码定义,如下图所示:

Java中equals与==有什么区别3

  我们可以从上面的源码中看出,Object中的equals()方法用于判断this和obj本身的值是否相等,即用来判断调用equals方法的对象和形参obj所引用的对象是否是同一对象。所谓同一对象就是指两个对象是否指向了内存中的同一块存储单元,如果this和obj指向的是同一块内存单元,则返回true;如果this和obj指向的不是同一块内存单元,则返回false。如果没有指向同一内存单元,即便是内容完全相等,也会返回false。所以 Object类中equals()方法的定义,equals()方法与"=="操作符其实是等效的,都是用于比较两个对象的引用地址是否相等。

  但是String、Integer等类,对Object的equals()方法进行了重写。尤其是String中的equals()方法,重写之后,其内部定义与Object的equals()方法的作用是不同的。接下来我们在看看String类中equals()方法的源码:

Java中equals与==有什么区别4

  通过阅读String类的equals()方法源码,我们可以得出如下结论:

  String类中equals()方法用于比较两个字符串是否相同。如果两个字符串的地址相同,则直接返回true;如果两个字符串的地址不同,则进一步判断字符串的内容是否相同,如果字符串内容完全相同,也会返回true。

  而 "=="操作符 进行比较时需要注意如下:

  要注意 "=="操作符 两边是否同一类型的数据,只有两边操作的是同一类型(或可以实现类型转换)才能编译通过。

  如果你可以把以上内容都能说出来,壹哥 相信,面试官会很大方的给你100分!

  5. 附加答案

  但是如果你还想让这个题目的答案更好,那么你可以再说一下,使用equals()方法时的一些特性要求,比如:

  自反性:对于任何非空引用x,x.equals(x)应该返回true;

  对称性:对于任何引用x和y,当且仅当y.equals(x)返回true,x.equals(y)也应该返回true;

  传递性:对于任何引用x,y和z,如果x.equals(y)返回true,y.equals(z)返回true,x.equals(z)也应该返回true;

  一致性:如果x和y引用的对象没有发生变化,反复调用x.equals(y)应该返回同样的结果;

  对于任何非空引用x,x.equals(null)应该返回false。

  回答到这里,恭喜你,面试官会给你120分了!

  更多关于“Java培训”的问题,欢迎咨询千锋教育在线名师。千锋已有十余年的培训经验,课程大纲更科学更专业,有针对零基础的就业班,有针对想提升技术的好程序员班,高品质课程助力你实现java程序员梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT