首先我们要比较的是引用类型。
==比较的是引用类型对象在内存中存放的地址。准确的说是堆内存中的地址。
而equals是基类Object自带的方法,我们写的每个类都会有这个默认的方法,你可以重写它也可以不重写。代码是:
也就是说当我们自己写的类,我们没有重写equals方法时,equals等同于==。
我们来看下一个小demo:
class A{
int a=0;
public A(int a)
{
this.a=a;
}
}
public class Test {
public static void main(String[] args) {
A a1=new A(1);
A a2=new A(1);
System.out.println(a1==a2);
System.out.println(a1.equals(a2));
}
结果:
false
false
原因:因为没有重写equals方法,所以equals等同于==。
我们来打印下它们的地址:(当没有重写toString方法的时候可以这么打印它们的地址)
System.out.println(a1);
System.out.println(a2);
结果:
Chapter_one_02.A@6d06d69c
Chapter_one_02.A@7852e922
(正常来说,你们的结果和我的不一样,但是我们需要知道的是,第一个地址和第二个地址不一样就行了,所以是false。)
然后我们再来看另一种情况:
String s1=new String("a");
String s2=new String("a");
System.out.println(s1==s2);
System.out.println(s1.equals(s2));
结果:
false
true
那么在这里为什么equals是true呢?创建两个对象,地址肯定不一样。
是因为String重写的equals方法,我们来看下String类的equals方法:
因为它重写了equals方法,所以在调用equals方法的时候,就不等同于==。
我们不能直接打印它们的地址,因为String类重写了toString方法。
总结:如果类没有重写equals方法,那么equals等同于==。
如果重写了,equals就不等同于==。
在eclipse中 鼠标方法方法名上,ctrl+ t,就可以看到源码。
如果发生Source not found ,参考:https://blog.csdn.net/qq_36743482/article/details/78622343