Java ==和equals的区别:是否比较地址值
首先我们要比较的是引用类型。
==比较的是引用类型对象在内存中存放的地址。准确的说是堆内存中的地址。
而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 ,参考:
上一篇:
IDEA上Java项目控制台中文乱码