我们经常会去判断两个东东相等,却也没怎么关注==和equals区别,就知道基本数据类型用==,比较两个字符串内容相等就用equals,当时老师就这么跟我说的,理由也没说,反正==就是不行。为防止混淆,还是简单总结一下吧。
1.比较基本数据类型
只能用‘==’,不能用‘equals’,‘==’比较的就是两个基本数据类型的值
2.比较包装类
public class TestEquals
{
public static void main(String[] args)
{
Integer b1=new Integer(1);
Integer b2=new Integer(1);
System.out.println(b1==b2); //false
System.out.println(b1.equals(b2)); //true
}
}
这是我盗的一个代码。这里‘==’比较的是对象的内存地址,那为什么就不等了呢,我们都知道在堆里new了两个不同的对象,所以在栈里所存放的地址是不一样的。这里的‘equals’比较的是对象的内容,为什么就等了呢,因为它们存的都是1啊。也是,equals为什么比较的就是内容呢,因为包装类把equals方法重写了。请看,盗代码啦。
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
3.比较String
这个比较特殊,不是基本数据类型,属于引用类型,所以道理也跟比较包装类一样的。‘==’比较的是内存地址,‘equals’比较的是值。
4.比较对象
既然前面都说包装类和String的euqals方法都被重写了,那我们来比较一下由自己写的类创建的对象呢。
TestEquals a=new TestEquals("x");
TestEquals b=new TestEquals("x");
System.out.println(a==b); //false
System.out.println(a.equals(b)); //false
啊哈,怎么a.equals(b)不等了呢?明明对于引用类型,‘==’比较的是内存地址,‘equals’比较的是值啊。如果你这么想,就大错特错啦。我们所写的类都是继承Object类的,而Object类的equals方法是这样的:
public boolean equals(Object obj) {
return (this == obj);
}
它比较的依然是内存地址啊,我们又没有对equals方法进行重写,还是调用的Object的equals方法,所以比较的依然是内存地址。而,包装类和String是重写了equals方法的。
所以总结如下:
"=="除了比较基本数据之外都是比较的内存地址
"equals"除了没有重写equals方法的类之外都是比较的内容