黑马程序员技术交流社区

标题: equals和==的区别 [打印本页]

作者: 孟茹    时间: 2014-3-6 16:44
标题: equals和==的区别
我先问下equals和==的区别  老模糊了

作者: 天凌蓝    时间: 2014-3-6 16:47
    equals用来比较两个对象的属性值是否相同,需要在你的类中覆写equals方法,因为你的类默认会继承Object类的equals方法,而Object类的equals方法是比较对象之间的引用地址值是否相同,相当于“==”的用法,在java中除了一些比较特殊的类,像String类一样有覆写Object类方法外,其他一些类继承后是没有覆写的。
  “==”就是比较引用类型,比如对象之间的引用地址值是否相同。
作者: 文江江    时间: 2014-3-6 16:58
  ==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。
  如果一个变量指向的数据是对象类型的,那么,这时候涉及了两块内存,对象本身占用一块内存(堆内存),变量也占用一块内存,例如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方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。
作者: syusikoku    时间: 2014-3-6 17:25
equals是判断对象否的内容是否相同时使用。而==是判断基本数据类型是否相等时使用。
作者: 12560zhang    时间: 2014-3-6 18:40
==操作符专门用来比较两个变量的值是否相等,也就是用于比较变量所对应的内存中所存储的数值是否相同,要比较两个基本类型的数据或两个引用变量是否相等,只能用==操作符。equals方法是用于比较两个独立对象的内容是否相同
作者: syw02014    时间: 2014-3-6 19:18
          一、对于字符串变量来说,使用“==”和“equals()”方法比较字符串时,其比较方法不同。
          “==”比较两个变量本身的值,即两个对象在内存中的首地址,“equals()”比较字符串中所包含的内容是否相同。
          比如:
                    String s1,s2,s3 = "abc", s4 ="abc" ;
                    s1 = new String("abc");
                    s2 = new String("abc");
          那么:
                    s1==s2   是 false      //两个变量的内存地址不一样,也就是说它们指向的对象不 一样,故不相等。
                    s1.equals(s2) 是 true    //两个变量的所包含的内容是abc,故相等。
          注意
          1:
          如果: StringBuffer s1 = new StringBuffer("a");
                     StringBuffer s2 = new StringBuffer("a");                  
          结果:s1.equals(s2)  //是false
          解释:StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类, 而Object类中的equals方法是用来比较“地址”的,所以等于false.
          2: 对于s3和s4来说,有一点不一样要引起注意,由于s3和s4是两个字符串常量所生成的变量,其中所存放的内存地址是相等的,所以s3==s4是true(即使没有s3=s4这样一个赋值语句)

         二、对于非字符串变量来说,"=="和"equals"方法的作用是相同的都是用来比较其
         对象在堆内存的首地址,即用来比较两个引用变量是否指向同一个对象
         比如:
class A
{
        A obj1   =   new  A();
        A obj2   =   new  A();
}
那么:obj1==obj2是false
      obj1.equals(obj2)是false
但是如加上这样一句:obj1=obj2;
那么 obj1==obj2  是true
      obj1.equals(obj2) 是true
总之:equals方法对于字符串来说是比较内容的,而对于非字符串来说是比较其指向的对象是否相同的。
== 比较符也是比较指向的对象是否相同的也就是对象在对内存中的的首地址。
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以是true。

作者: love~陌    时间: 2014-3-7 07:42
  “==”运算符与equals()方法的区别
  
  前者用于比较两个引用数据类型的变量的值是否相等,
  后者用于比较两个引用变量所指向的对象的内容是否一样

  
  1. class YDemo
  2. {
  3.         public static void main(String[] args)
  4.         {
  5.                 Integer x=new Integer(1);
  6.                 Integer y=new Integer(1);
  7.                 Integer z=x;
  8.                 sop(x==y);
  9.                 sop(x==z);
  10.                 sop(x.equals(y));
  11.         }
  12.         public static void sop(Object obj)
  13.         {
  14.                 System.out.println(obj);
  15.         }
  16. }
复制代码

运行结果为
false
true
true
作者: love~陌    时间: 2014-3-7 07:45
顺便解释一下,
当对象x,y建立的时候,在内存中的地址值是不一样的,而z则是和x一样指向同一个地址值
==在这里按地址值来比较,boolean值就显而易见了
equals比较的是对象的内容是否一致,结果也就知道了
作者: 黄翔    时间: 2014-3-7 09:18
equals方法用于检测一个对象是否等于另外一个对象。在Objecet类中,这个方法判断的是两个对象是否具有相同的引用。因为Object是所有类的基类,所以子类中定义equals方法时,首先带调用超类的equals,如果检测失败,对象就不可能相等。如果超类中检测相等,就需要比较子类中的实例域。

==进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2