equals方法比较的是内容?谁告诉你的
回复“000”获取程序员必备电子书
故事
前段时间,我给一位小伙伴做在线模拟面试的时候,随口问了一句:”说说 ==和equals方法的区别?
“,结果给我回答一个equals
方法是比较内容的。
我们先来说说==
,==
比较有两种情况:
1.比较的是基本数据类型
int a=100;
int b =10;
//比较的是两个变量对应的值
if(a==b){
System.out.println("出问题了");
}
2.比较的是引用类型
Integer a=Integer.valueOf(100);
Integer b =new Integer(100);
//比较的是a和b指向的对象地址是否相同
if(a== b){
System.out.println("出问题了");
}
然后,我们再来说说equals方法。
equals方法是在Object中定义的,具体如下:
public boolean equals(Object obj) {
return (this == obj);
}
从这方法里,我们能得出结论:如果不重写equals
方法,那么比较的就是两个对象地址。
至于,重写了,比较的是什么?
这就好比吃饭,在大多数人心中,提到吃饭,就会想到吃面或吃米饭。对不起,现在很多人所谓的吃饭可能就是只吃菜,并没有吃米饭或面。
下面我们来说说,两个常见类:String
类和Integer
类。
String
类中的equals
方法:
public boolean equals(Object anObject) {
//先比较对象地址
//对象地址是同一个,那证明就是同一个对象
if (this == anObject) {
return true;
}
//比较类型
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;
}
从整个方法的源码逻辑,我们很容易看出,String类的equals方法也不是一定要比较内容,先是比较两个对象地址,然后比较长度,在比较具体内容。
Integer
类中的equals
方法:
public boolean equals(Object obj) {
//比较类型
if (obj instanceof Integer) {
//先拆箱 再比较具体值
//注意 这里的value 是int类型的变量
return value == ((Integer)obj).intValue();
}
return false;
}
总结
这个面试题,看似很简单,我后面还可以问了另外两个三年的工作的朋友,回答也是和前面那位朋友的一样。下面对此进行一个总结:
==
如果是用于基本数据类的比较,则比较的是具体值,如果比较的是引用类型(包装类型),则比较的是两个对象指向的对象地址是否相等。
equals
方法,默认不重写的情况下是比较两个对象的地址是否相同。如果自己对equals
方法重写了,那就得看是怎么重写的。
好了,今天就分享到这里,记得关注我,讲述一些不一样知识点,还能附带的带着你看一些源码,记住:很多好东西都在源码中才可以看到的。