java中==和equals的区别
在JDK1.8中,我们在判断相等的时候,使用==或者equals是必不可少的,可是它们两个有什么区别呢?
首先我们先看看equals的方法,我们都知道equals是超类Object中的方法,先看看Object是怎么实现的:
因为equals是Object中的方法,是所有类的父类,所以不适合于大多数场景。所以,我们在使用的时候,一般都是要重写Object中的equals方法。而Object中的equals方法,底层操作依然是使用==进行比较的。
两个方法的作用
==方法的作用:如果比较的是Java中的基本类型,比较的是储存的值是否相等,如果是引用类型,则比较的是两个地址是否相等。
equals方法的作用:判断两个对象是否引用同一个对象,即看他们的地址是否相同。
在java中,对于基本类型,变量直接储存的是“值”,而对于引用类型,变量储存的则是对象的引用。
所以对于引用来说,如果没有重写equals方法,它的使用效果和==是相等的
看个列子:
没有重写equals 重写equals
通过上面的图,我们就可以看出来,当比较的都是对象的时候,如果没有重写equals,它的作用和==相等的,都比较的是地址,而当我们重写equals后,equals比较的就是我们重写后的值,==依然比较的是地址 。
对于String,JDK已经重写了equals方法
通过对源码的剖析,我们可以看出来,String类底层通过equals方法比较的时候,比较的是,两个字符串中的每一个字符是否相等。
例如:
可以看出来,String通过重写父类后的方法后,对字符串的值进行了比较。
总结
1、对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等。
如果作用于引用类型的变量,则比较的是所指向的对象的地址。
2.对于equals方法,注意:equals方法不能作用于基本数据类型的变量。
如果没有对equals方法进行重写,则比较的是引用类型的变量所指向的对象的地址。
诸如String、Date等类对equals方法进行了重写的话,比较的是所指向的对象的内容。