对于这种常规性的面试题目,我们应该回答出与别人不一样的地方,才能给面试官留下足够好的印象。
接下来 壹哥 会从以下几个维度来阐述这个问题:
两者性质不同
两者比较的角度不同
比较速度不同
底层实现不同
附加答案
1. 两者性质不同
首先我们要搞清楚,"==" 是Java里的一个 二元操作运算符,用于比较基本类型和对象,而 equals()是类中的一个方法,用于检查两个对象内容的相等性。
说到方法,我们要再明确一点,equals()到底是谁的方法?
一般来说,equals()指的都是超类Object中的方法。但在二般情况下,equals()也可能是Object的某个子类的方法,比如String、Integer、Long等子类中也有equals()方法。Object类中的equals()方法与String类中的equals()方法内部实现就不一样!
2. 两者比较的角度不同
一般情况下,equals()方法用来比较两个对象的内容是否相同。比如下面的代码:
上面代码中,s1与s2是两个完全不同的对象,引用地址肯定不同,但是s1与s2里的字符串内容是相同的,所以s1.equals(s2)的结果为true!
stu01与stu02也是两个完全不同的Student类对象,但是两个对象的内容相同,所以stu01.equals(stu02)的结果也是true;而stu03.equals(stu04)的结果则为false,因为stu03与stu04两个对象里的内容不同!
而对于 "==" 操作符来说,应该分为两种情况来讨论,即比较基本数据类型和比较引用类型,具体如下:
(1). 基本数据类型:比较的是两个基本数据类型的值是否相等,比如两个整型值是否相等。
(2). 引用数据类型:比较的是两个引用对象的引用地址是否一样,比如说新建了两个对象,比较的是两个对象的引用地址是否一样。
上面的代码中,stu01==stu02的结果为false,s3 == s4的结果也为false,因为彼此两个对象都是不同的对象,引用地址不一样。
3. 比较速度不同
equals()方法的比较速度没有 "==" 运行速度快,因为 "==" 只是比较两个对象的引用地址是否一样。
4. 底层实现不同
如果你可以回答出上面的这些内容,已经可以得到80分了。但是到此为止,我们其实还没有回答出深层次的内容,所谓深层次的内容,就是支持我们得出上面结论的依据在哪里。所以我们可以继续扩展回答一下,跟面试官聊聊底层源码的实现。
我在上面说过,对于equals()方法,首先应该明确到底是谁的equals()方法,是Object类的equals()方法,还是String类的equals()方法?搞清楚这个很重要!
我们先来看看Object类中equals()方法的源码定义,如下图所示:
我们可以从上面的源码中看出,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()方法的源码:
通过阅读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程序员梦想。