面试中equals和==还傻傻的分不清?
作者:互联网
开场白:
Hello,大家好,我是你们的老朋友大黄。可能很多同学在面试过程中对于并发的知识、Spring等核心知识准备的比较充分,而且回答的比较好。但是当刚好是面试的时候,大部分面试官面试的难度都是由难变易的,刚开始面试,面试官准备用一道简单的题目来热热身子,暖暖场。相反这些问题才是整场面试的关键,回答的不好,面试官失去了继续聊下去的欲望了。
面试官:
大黄同学是吧?你来说一下equals和==之间的区别吧?通常在哪些地方会用上呢?
大黄:
此刻内心波动,好家伙这题我会,我可是早早准备过的。
== 对于不同的类型比较的是不一样的,基础类型对比的是值是否相同,引用类型对比的是引用是否相同;而 equals 则是比较的值是否相同
面试官:
你确定是这样的吗?对于所有的对象equals都是比较的值吗?
大黄:
os: 为啥这么问,这题我准备过的,就是这样的吧。。
我印象中确实是这样的,equals 比较的确实值是否相同。
面试官此刻内心mmp,这也不清楚,赶快结束,我还得回去工作呢。脸上却还是笑嘻嘻的说
嗯,好的,你下去再看看。我们再问问其他的问题
过两天之后,面试结果杳无音信,仁慈的公司可能会发送一条感谢信。
【xx出行】感谢您对xx机会的关注,诚邀您参与我们的应聘者体验调研,以帮助我们提升招聘体验。链接:https://page.xiaojukeji.com/active/ddpage_0aGzHCjT.html?callback=TWpjNU16UTBOdz09
痛定思痛的大黄决定从此以后牢牢解决这个问题,翻遍天下奇书、搜索各大论坛得到如下真经。
1. ==解读
对于基本类型和引用类型 == 的作用效果是不同的,两者比较如下
- 基本类型:比较的是值是否相同;
- 引用类型:比较的是引用是否相同;
我们可以来看一个简单的实例:
public static void main(String[] args) {
String x = "Hello";
String y = "Hello";
String z = new String("Hello");
System.out.println(x==y); // true
System.out.println(x==z); // false
System.out.println(x.equals(y)); // true
System.out.println(x.equals(z)); // true
}
第一个
System.out.println(x==y);
对于引用对象的x和y,指向的是同一个字符串,两个引用是相同的,因此输出true。
System.out.println(x==z);
对于字符串z会指向新new出来的一个字符串对象,x与z指向的不是同一个字符串对象。
具体的内存可以参见下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SbFCI88v-1608807352767)(./images/01equals.png)]
2. equals含义
equals 本质上就是 ,只不过 String 和 Integer 等重写了 equals 方法,把它变成了值比较。看下面的代码就明白了,如果没有重写equals方法,默认是按照进行比较,如果是普通的对象,则比较的是引用类型。
- 如果是基本类型,则采用的是Object的equals方法进行比较
- 如果是字符串,String类重写了equals方法,采用String的equals方法比较
- 如果是一般对象,并且没有重写equals方法,则默认采用的==进行比较
先看例子,在看代码。
public class EqualsAndSame {
public static void main(String[] args) {
String x = "Hello";
String y = "Hello";
Integer a = 1;
Integer b = 1;
// 因为比较的是基本类型,采用的基本数据类型重写的equals方法,比较的是值
System.out.println(a.equals(b));
// 因为比较的是字符串,采用的String重写的equals方法,比较的是各个字符串
System.out.println(x.equals(y)); // true
Person lisi0 = new Person("lisi",21);
Person lisi1 = new Person("lisi",21);
// 因为比较的是对象,因为Person类没有重写自己的equals方法,因此默认采用Object的equals()方法
System.out.println(lisi0.equals(lisi1));
}
}
class Person{
private String name;
private Integer age;
public Person(String name, Integer age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
1. Object类中的equals()
equals()如果不被重写,则底层比较方式和基本一致,底层就是通过来比较的。
public boolean equals(Object obj) {
return (this == obj);
}
2. 基本类型的equals比较
/**
* 本质上比较Integer对象的值
* @param obj 比较的对象
* @return
*/
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
3. String的equals()方法
/**
* 比较两个字符串是否相等
* 当anObject对象不为空且该对象与比较对象完全相等是返回true
* @param anObject
* @return
*/
public boolean equals(Object anObject) {
// 1. 如果被比较对象与anObject完全相等时则返回true
if (this == anObject) {
return true;
}
// 判断字符是否是字符串类型
/**
* 2.1 首先判断两个字符串长度是否相等,相等则继续比较内部元素;否则直接返回false
* 2.2 利用while循环依次比较两个数组内部字符是否相等
*/
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}
好了,今天的大黄每日成长技能到此结束了。
平时不积累,面试空流泪。
标签:return,String,equals,public,Integer,傻傻的,分不清,比较 来源: https://blog.csdn.net/weixin_37690143/article/details/111647770