【Java】浅谈“equals“和“==”
在java中,equals方法和==都是用来作比较的,可是你知道它们之间有什么区别和联系吗?
首先,透露一点,在所有类的父类Object中,equals在本质上和==都是一样的,如果查看源码,你会发现这里面equals方法的内部实现就是==;
如果是比较两个Object对象的大小,直接用==就可以了。
“==”
1、判断比较的两个对象是否是同一个对象,内存地址是否相同;
2、比较的两个对象必须是同一类型的数据,或者是子类和父类之间的比较。否则编译不通过;
3、如果是数字之间的比较,比较的是数值是否相等,直接使用“==”。
equals()方法
1、一般情况下,我们使用equals来比较的是两个对象的内容是否相等;
2、由于所有的类都是Object类的子类,如果一个类没有对该方法进行重写的话,在调用该方法时会调用Object类中的equals()方法。
介绍一个比较特殊的类——String。首先,我们都知道,当我们用new去创建一个新对象的时候,会在堆中开辟出一个新的地址,所以用==比较两个相同值的对象时,会返回false。但是在String重写了Object类的equals方法。
当创建两个相同值的String对象时,调用equals方法比较的是String对象的值,所以返回true。
但是String类也比较特殊,它可以直接通过赋值产生一个对象,例如:String s1 = “abc”;String s2=“abc”;在用“==”比较两个String对象的时候,如果String对象都是直接赋值产生的,结果会返回true。猜一猜这是为什么?
String是引用类型,所以s1和s2中只是存放了地址,而它的值不是new出来的,在编译阶段就可以确定下来,所以这个值被系统存放在常量池中,而不是在存放在堆中,这时候再创建一个s2=“abc”,因为同样是要放在常量池中,创建时发现常量池中已经存在同样的数据,直接把s2指向了常量池中的“abc”,所以s1和s2指向同一块地址。Are you OK?
示例代码如下所示:
话说s1和s4不应该指向同一块地址吗?为什么会返回false呢?
注意一下
1、如果是我们自己写的类,要按照属性比较两个对象是否相等时,需要重写equals方法,否则会直接调用Object的方法,判断两个对象的地址是否相等。另外重写equals方法时,需要重写hashcode方法,以后再讲具体原因。
2、"=="比"equals"的运行速度快,因为"=="只是比较引用的地址。