A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 汪平乐 高级黑马   /  2013-1-25 23:49  /  2650 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 汪平乐 于 2013-2-19 18:15 编辑

详细讨论equals和==的区别
==操作符:==操作符只负责引用的“值”相等,至于这个地址所指向的对象内容是否相等,==操作符是不管的。
而一个类如果没有定义equals方法,它将默认继承Object中的equals方法,返回值与==方法相同。最好可以有代码实例,或是详细的用法...

10 个回复

倒序浏览
equals 是方法,用来检测两个对象的内容是否相等。==是符号,他比较的是一个对象在内存中的地址值,比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true 而在比较引用时,如果引用指向内存中的同一对象,结果为true
如:str = new String("hello world!"); //创建的是字符串对象
str.equals("helloworld!"); //返回true
str1 == "hello world!" //返回false
如果s1 = "sony";s1 == "sony" //返回true

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 廖成 于 2013-1-26 11:23 编辑

java中的数据类型,可分为两类:
1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean
  他们之间的比较,应用双等号(==),比较的是他们的值。
2.复合数据类型(类)
  当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。 JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个equals的方法,这个方法的初始行为是比较对象的内存地 址,但在一些类库当中这个方法被覆盖掉了,如String,Integer,Date在这些类当中equals有其自身的实现,而不再是比较类在堆内存中的存放地址了。
  对于复合数据类型之间进行equals比较,在没有覆写equals方法的情况下,他们之间的比较还是基于他们在内存中的存放位置的地址值的,因为Object的equals方法也是用双等号(==)进行比较的,所以比较后的结果跟双等号(==)的结果相同。
  1. public class TestString {
  2.   public static void main(String[] args) {
  3. String s1 = "Monday";
  4. String s2 = "Monday";
  5. if (s1 == s2)
  6. {
  7. System.out.println("s1 == s2");}
  8. else{
  9. System.out.println("s1 != s2");}
  10. }
  11. }
复制代码
编译并运行程序,输出:s1 == s2说明:s1 与 s2 引用同一个 String 对象 -- "Monday"!
2.再稍微改动一下程序,会有更奇怪的发现:
  1. public class TestString {
  2. public static void main(String[] args) {
  3. String s1 = "Monday";
  4. String s2 = new String("Monday");
  5. if (s1 == s2)
  6. {System.out.println("s1 == s2");}
  7. else
  8. {System.out.println("s1 != s2");}
  9. if (s1.equals(s2)) {System.out.println("s1 equals s2");}
  10. else{
  11. System.out.println("s1 not equals s2");}
  12. }
  13. }
复制代码
我们将s2用new操作符创建
程序输出:
s1 != s2
s1 equals s2
说明:s1 s2分别引用了两个"Monday"String对象

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
我的一点简单理解,对错不好说啊,一般情况下,==比较是不是同一个,就是说我只比较内存地址相同是true,不同是false。equlas比较是不是同一类。但是要注意一点equals在不同的对象里面有不同的重写方法。所以其实equals是变化的。
打个比方说,有个苹果从他爹水果那里继承了一个equals方法,这个方法比较的是两个东西是不是都是水果。那么当苹果调用equals的时候,不论你比较的是苹果,还是桃梨之类的,只要是水果都是true,不是水果才是false。
结果有一天苹果对他爹说了,我不想用你的了,我要有自己的方法,因此苹果重新定义了equals的内容,你只有是苹果的时候,才返回true。这时你只有给我苹果才会返回true,桃和梨等就返回false。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
①==和equals的实质。

       在JAVA中利用"=="比较变量时,系统使用变量在"栈"中所存的值作为比较的依据。

       基本数据类型在"栈"中存的是其内容值,而对象类型在"栈"中存的是地址,这些地址指向"堆"中的对象。

       java.lang包中的Object类有public boolean equals(Object obj)方法,它比较两个对象是否相等。

       其它对象的equals方法仅当被比较的两个引用指向的对象内容相同时,对象的equals()方法返回true。

       总之,"=="和"!="比较的是地址.也可认为"=="和"!="比较的是对象句柄;而equals()比较的是对象内容.或者说,,"=="和"!="比较的是"栈"中的内容,而equals()比较的是"堆"中的内容.

       ②==操作符。专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相当,只能用==操作符。

      Java的基本数据类型为(char,byte,short,int,long,float,double,boolean)。

      如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(对内存),变量本身也占用一块内存,例如Object obj = new Object()变量obj是一个内存,new Object()是一个内存,此时,变量所对应的内存中存储的数据就是对象占用的那块内存的首地址。对于指向对象内存的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。

       ③构造器形成的差别。对于String和Integer来说,由于他们特有的创建对象的方式。使用构造器和不使用构造器得到一个对象,==方法比较所产生的结果是不同的。 String a = “abc”; String b = "abc"; 此时a==b得到结果为true。String a = new String("abc"); String b = new String("abc");此时a==b得到的结果为false。Integer a = 1; Integer b = 1;此时a==b的结果是true。Integer a = new Integer(1); Integer b = new Integer(1);此时a==b得到的结果为false。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
equals和==的区别:
1. ==操作比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量在堆中存储的地址是否相同,即栈中的内容是否相同。
2. equals操作表示的两个变量是否是对同一个对象的引用,即堆中的内容是否相同。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
“==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
equal用于比较两个对象的值是否相同【不是比地址】

回复 使用道具 举报
本帖最后由 黄成超 于 2013-1-29 13:18 编辑

个人对两者的理解:
"=="侧重的是“同一”,比如如果说对象的话,那么它指的就是同一对象;而equals的话,它的侧重于内容的匹配或相等。只是便于理解。当然,你也可以根据自己的需求复写 boolean equals(Object obj),这点上面已有说明!
回复 使用道具 举报
孔斌 中级黑马 2013-1-29 13:24:44
9#
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如Objet obj = new Object();变量obj是一个内存,new Object()是另一个内存,此时,变量obj所对应的内存中存储的数值就是对象占用的那块内存的首地址。对于指向对象类型的变量,如果要比较两个变量是否指向同一个对象,即要看这两个变量所对应的内存中的数值是否相等,这时候就需要用==操作符进行比较。
equals方法是用于比较两个独立对象的内容是否相同,就好比去比较两个人的长相是否相同,它比较的两个对象是独立的。例如,对于下面的代码:
String a=new String("foo");
String b=new String("foo");
两条new语句创建了两个对象,然后用a,b这两个变量分别指向了其中一个对象,这是两个不同的对象,它们的首地址是不同的,即a和b中存储的数值是不相同的,所以,表达式a==b将返回false,而这两个对象中的内容是相同的,所以,表达式a.equals(b)将返回true。
在实际开发中,我们经常要比较传递进行来的字符串内容是否等,这是错误的,字符串的比较基本上都是使用equals方法。
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:
boolean equals(Object o){
return this==o;
}
这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
equals属于是Object中的方法,而==只是操作符。在比较中,是对象的当然是选用equals,是基本数据类型的当然选用==;这样也更能区分开对象和数据类型。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马