在Java中通常利用"=="与"equals()方法"来进行比较,那么这两种方法到底有什么区别呢?
数据类型分为基本数据类型和引用数据类型,如果将要进行比较的是基本数据类型,那么就只能选择"=="来进行比较;
如果是引用数据类型,那么"=="与"equals()方法"都可以选择。
我们先来了解一下这两种方法:"=="是运算符,对于基本数据类型是比较值,而对于引用数据类型则是比较的内存地址值;例如:
上图中的a==b等同于5==5,结果自然是true。
可能会有人说:“张三”和“张三”不就是一样的吗,结果应该是true才对呀。String是引用数据类型,在利用"=="比较时,比较的是它们的内存地址值,s1是new的一个空间,s2是new的另一个空间,两个“张三”虽然内容一样,但是它们所处空间不同。打个比方:安徽有个叫“张三”的人,北京也有个叫张三的人,再夸张一点,他们长得还一摸一样,那就能说这两个张三是同一个人吗?显然是不能的,就算他们再相像身份证也是不一样的。引用数据类型进行"=="比较时的原理就是这样。
equals()是Object父类中的方法,基本数据类型不能使用"equals()方法;而Object父类中的equals()方法比较的是两个对象的地址值。例如:
定义了一个Person类,它运用的equals()方法是继承Object类的, p1和p2分别new了两个空间,内容虽然一样,但地址值并不一样,所以结果为false。我们可以看一下底层代码:
this指的是调用equals()方法的对象,return的是"==",前文我们说了引用数据类型"=="比较的是内存地址值,所以结果为false。
可能还会遇到这种情况:
String也是引用数据类型,按道理说结果应该和图3一样为false才对,但显然运行结果为true,这是为什么呢?原因是String的equals()方法并不是继承Object类的,而是经过覆盖重写后的,底层代码如下:
显而易见的是,String和Object类的equals()方法并不一样,String底层是char[ ],v1[ i ]!=v2[ i ]时return false,也就是说v1[ i ]==v2[ i ]时return true,而char是基本数据类型,所以String下经过覆盖重写的equals()方法比较的是具体的内容。
如果其它继承Object类的equals()方法的引用数据类型也想达到和String一样的效果,就需要覆盖重写equals()方法。
总的来说,"==",对于基本数据类型比较的是具体值,对于引用数据类型来说比较的是内存地址值;equals()方法,不适用于基本数据类型,对引用数据类型也稍有区别:继承Object类的equals()方法的引用数据类型比较的是地址值,一些引用数据类型会覆盖重写equals()方法,比较的是具体值或内容,自定义类也可以根据自己覆盖重写的规则来进行比较,