简单看个例子
public class compare {
int a;
public compare(int a) {
this.a=a;
}
public static void main(String[] args) {
int x = 0;
int y = 0;
compare com=new compare(1);
compare com1=new compare(1);
if (x == y) {
System.out.println("xy相等");
} else
{
System.out.println("xy不相等");
}
System.out.println("com,com1用==比较");
if (com == com1) {
System.out.println("com,com1相等");
} else
{
System.out.println("com,com1不相等");
}
System.out.println("com,com1用equels比较");
if (com.equals(com1)) {
System.out.println("com,com1相等");
} else
{
System.out.println("com,com1不相等");
}
}
}
运行结果:
==比较的是引用指向的地址是否相等,可以简单理解为比较地址
x和y这两个引用都指向存放0这个数字的内存的地址,所以相等
我们经常会理解equals是用来比较内容的,通常情况下是正确的,比如说String类两个new出来的实例内容相同的话用equals比较那么就是相等的,那为什么例中com1和com的内容相等用equals比较却是不相等呢??
我们看下equals的源码:
通过源码我们可以看到居然还是用==来判断是否相等!!
那String类的equals方法又是怎么回事??不急我们看下String类的equals方法源码:
原来这两个equals方法实现不一样!!
到这里相信大家都明白了,String类之所以可以用equals方法比较内容,那是因为String 类重写了Object类的equals方法!
而所有的类都是基于Object类的
所以呢,我们如果要比较com和com1的内容就要重写Object类的equals方法:
@Override
public boolean equals(Object obj) {
if(obj instanceof compare)
{
compare com=(compare)obj;
if(a==com.a)
{
return true;
}
}
return false;
}
运行结果: