equals和==的区别变量在前面和后面的区别

版权声明:本文为博主原创文章,未经博主允许不得转载。 /u/article/details/

关于变量之间的比较,可以分为基础类型变量的比较和对象之间的比较。

对于基本类型来说,他们存储在jvm的栈中,因此比较的是变量的内容,也就是比较的变量的值。


对于引用类型来说,因为对象内容存储在jvm的堆中,栈中只是存储对象的引用(地址),无论是==还是equals比较的都是栈中的内容,即对象的引用,也就是比较的是两个对象的地址。但根据创建对象的方式不同可以分为两种情况:

1. 使用表达式创建对象:


2.使用new方法创建对象:


这里会引入两个新的问题:

1.为什么表达式创建和new创建,会让==比较产生不同的结果。

这是因为jvm在程序运行的时候会创建一个缓冲池,当使用表达式创建的时候,程序会在缓冲池中寻找相同值的对象,如果找到,就把这个对象的地址赋给当前创 建的对象,因此,c和d实际上都指向了c的引用。因此在使用==时会返回true。

当用new创建对象时,是在堆中重新分配内存,因此栈中的引用是不相同的,所以,a和b引用的是值相同的不同对象。所以a==b返回false

我们可以自己创建一个类,并验证。

1.当自定义Value类中没有重写equals方法时,调用equals方法返回结果为false。说明此时equals比较的并不是内容。

超类Object中有这个equals()方法,该方法主要用于比较两个对象是否相等。该方法的源码如下:

我们知道所有的对象都拥有标识(内存地址)和状态(数据),同时“==”比较两个对象的的内存地址,所以说使用Object的equals()方法是比较两个对象的内存地址是否相等,即若object1.equals(object2)为true,则表示equals1和equals2实际上是引用同一个对象。虽然有时候Object的equals()方法可以满足我们一些基本的要求,但是我们必须要清楚我们很大部分时间都是进行两个对象的比较,这个时候Object的equals()方法就不可以了,实际上JDK中,String、Math等封装类都对equals()方法进行了重写。下面是String的equals()方法:

首先笼统的来讲   “java中equals()方法和“==”运算符”   都是比较的地址,那为什么我们在使用中总会出现混淆的情况呢老是弄错呢,这是因为“重写equals()方法”和一些 “特殊情况”的存在。

1)对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。

  “==”比较两个变量本身的值,即两个对象在内存中的首地址。

  “equals()”比较字符串中所包含的内容是否相同。

解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,Object类中的equals方法是用来比较“地址”的,所以等于false.

对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句)

2)对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象

总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。

   String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。

  • 如果是基本类型比较,那么只能用==来比较,不能用equals

要明白他们两个的区别首先要知道他俩分别比较的是什么。

先说==。当比较的两边是8种基本数据类型时,==比较的就是变量里的值。举个例子

当==比较的是对象的时候,比较的并不是变量里的值,而是比较的对象在内存中的地址了。举个例子

然后是equals,这个稍微复杂一点。首先equals方法是所有类的父类Object类里的方法,当子类没有重写equals方法时,调用的是Object类里的equals方法,Object里的equals方法只是简单的比较了一下两个变量的地址。

String类就重写了Object类的equals方法,所以当调用String类的equals的方法时比较的就是字符串是否相等了。还用上面那个例子说明下

equals是方法,要保证调用equals方法的变量不能为空,所以就不能使用null.eauals.(a),这样会报空指针异常。

我要回帖

更多关于 equals和==的区别 的文章

 

随机推荐