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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 敏敏好学 中级黑马   /  2014-9-16 16:39  /  1669 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

"=="和equals方法究竟有什么区别?

7 个回复

倒序浏览
"=="比较两个引用变量是否指向同一个对象
equals方法源自Object类,在Object类中该方法的实现和"=="完全相同。当然,Object的子类可以通过重写改变equals方法的比较规则
回复 使用道具 举报
看完一下文章,你会明白吧?
     == 操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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。在实际开发中,我们经常要比较传递进行来的字符串内容是否等,例如,String input = …;input.equals(“quit”),许多人稍不注意就使用==进行比较了,这是错误的,随便从网上找几个项目实战的教学视频看看,里面就有大量这样的错误。记住,字符串的比较基本上都是使用equals()方法。如果一个类没有自己定义equals()方法,那么它将继承Object类的equals()方法,Object类的equals()方法的实现代码如下: boolean equals(Object o){ return this==o; } 这说明,如果一个类没有自己定义equals()方法,它默认的equals()方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals()和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals()方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。

评分

参与人数 1技术分 +1 收起 理由
舍我其谁 + 1

查看全部评分

回复 使用道具 举报
==”是看两个对象是否是同一个对象,也就是两个对象引用是否指向同一个对象(Java分配的内存地址一样)当然如果用于int,long,double就不是看两个值是否相等了。 equals()是比较两个对象的内容是否相等,一般如果用户自己不定义针对自己的类的equals()方法,那么就会使用Object的活着你的类的父类的这个方法。如果你的类里没有对象引用的域,就不必要覆盖equals()(注意String域也是对象)String有自己的equals()方法(它已经覆盖了Object的该方法了
回复 使用道具 举报
本帖最后由 JTANISME 于 2014-9-16 18:57 编辑

{:2_31:}{:2_31:}{:2_32:}围观!
回复 使用道具 举报
回复 使用道具 举报
nyk 中级黑马 2014-9-16 22:00:02
7#
==是比较两个引用的物理地址相不相同,equals可以重写,一般用来比较对象的属性值相不相同
回复 使用道具 举报
本帖最后由 ⋛⋌⋚JEEP 于 2014-9-16 23:50 编辑
  1. <p>"=="是判断是否同一个对象,地址值是否相同。equals是用于进行两个对象的比较的,是对象内容的比较。
  2. 默认的equals()方法功能与“==”相同,一般Object的子类都有equals方法,在内部已经复写了父类Object的equals方法。
  3. 如果自定义一个类,要对比两个对象内容相同的情况,equals方法必须复写父类方法。
  4. 比如判断Student类的两个实例对象中属性name是否相同,因为是两个对象,只要名字相同就是表示同一个人,
  5.   而默认的equals表示是不是同一个对象,所以必须复写Object的equals方法。</p><p>又比如,在堆内存的两个对象,String str1 = new String("abc")和String str2 = new String("abc"),
  6. 尽管内容相同但是在堆内存中是两个对象,对象地址值不同,所以“==”是false,equals是true。</p><p>代码演示如下:
  7. public class Test1 {
  8.         /**
  9.          * @param args
  10.          */
  11.         public static void main(String[] args) {
  12. //                简单数据类型比较
  13.                 int a = 10;
  14.                 int b = 10;
  15.                 System.out.println("a==b?"+(a==b));
  16.                
  17. //                引用数据类型比较
  18.                 Integer c =new Integer(10);
  19.                 Integer d = new Integer(10);
  20.                 System.out.println("c==d?"+(c==d));
  21.         
  22. /*运行结果:
  23. a==b?true
  24. c==d?false
  25. 为什么?
  26. 因为运算符“==”比较的是两个变量是否引用同一对象。
  27. 第一种情况,常量一般都是存储在方法区中的常量池里,至始至终都是同一份数据,内存地址值是一样的。
  28. 第二种情况,引用型变量指向在堆内存中的两个不同对象,尽管对象内容相同,但是不是同一对象,内存地址值不同。
  29. */
  30.         
  31.         /*那么如何比较对象的值是否相等呢?
  32.         在java中提供了equals()方法用于比较对象的值。
  33.         我们把上面引用类型部分的程序稍作修改:*/
  34.         Integer c1 =new Integer(10);
  35.         Integer d1= new Integer(10);
  36.         System.out.println("c1 equals d1?"+(c1.equals(d1)));
  37.         }
  38. }
  39. /*运行结果:
  40. a==b?true
  41. c==d?false
  42. c1 equals d1?true
  43. 为什么?
  44. 因为Integer中的方法equals()进行的是“深层次比较”,它会去比较两个对象里面的值是否相等。

  45. 总结:
  46. 1、如果测试两个简单类型的数值是否相等,则一定要用“==”来比较;
  47. 2、如果要比较两个引用变量对象的值是否相等,则要用对象的equals()方法进行比较(其中的equals方法已经复写父类Object的equals方法);
  48. 3、如果需要比较两个引用变量是否指向同一对象(内存地址值相同),则使用“==”来进行比较;
  49. 4、对于自定义的类,应该根据情况覆盖其父类或Object类中的equals()方法,否则默认的equals()方法功能与“==”相同。</p>
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马