黑马程序员技术交流社区

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

作者: laine    时间: 2015-5-4 17:05
标题: ==和equal的区别
==和equal的区别
作者: 木头人之死    时间: 2015-5-4 17:15
解释一下==号,他比较的是一个对象在内存中的地址值,
比如2个字符串对象
String s1 = new String("str");
String s2 = new String("str");
如果用==号比较,会返回false,因为创建了两个对象,他们在内存中地址的位置是不一样的。

equals的情况比较复杂,它是java.lang.Object类中的一个方法。因为java中所有的类都默认继承于Object,所以所有的类都有这个方法。

在Object类源码中是这样写的。
public boolean equals(Object obj) {
return (this == obj);
}
他同样使用==号进行内存地址的比较。但是许多java类中都重写了这个方法,比如String。
public boolean equals(Object anObject) {
if (this == anObject) {
     return true;
}
if (anObject instanceof String) {
     String anotherString = (String)anObject;
     int n = count;
     if (n == anotherString.count) {
  char v1[] = value;
  char v2[] = anotherString.value;
  int i = offset;
  int j = anotherString.offset;
  while (n-- != 0) {
      if (v1[i++] != v2[j++])
   return false;
  }
  return true;
     }
}
return false;
    }

String里的方法,如果==号比较不相等,还会进行一下值的比较。
所以equals方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
作者: an_lucas    时间: 2015-5-4 17:47
学习了。。
作者: bingyu    时间: 2015-5-4 17:51
本帖最后由 bingyu 于 2015-5-4 17:59 编辑

class Test {
}
class Test2 {
  private int age;
Test2(int age) {
          this.setAge(age);
        }
public boolean equals(Object obj) {
                // TODO Auto-generated method stub
                return true;
        }
  public int getAge() {
        return age;
        }
  public void setAge(int age) {
         this.age = age;
        }
}
public class Eq {
public static void main(String[] args) {
                // TODO Auto-generated method stub
                int a = 10;
                long b = 10L;
                double c = 5.0;
                String s1 = "hello";
                String s2 = "hello";
                Test t1 = new Test();
                Test t2 = new Test();
                Test t3 = t1;

                // equals是对象才有的方法。
                // “==”比较的是值【变量(栈)内存中存放的对象的(堆)内存地址】
                // equal用于比较两个对象的值是否相同【不是比地址】一般被覆盖
                System.out.println(a == b); // true //“==”对于基本数据类型,栈中的值相等就行了...
                System.out.println((c + c) == a); // true

                System.out.println(s1.equals("hello"));// true          //String中的equals是已经写好了的
                System.out.println(s1 == "hello"); // true
                System.out.println(s1 == new String("hello")); // false
                System.out.println(s1.equals(new String("hello"))); // true
                System.out.println(s1.equals(s2)); // true

                System.out.println(t1.equals(t2)); // false    对象中的equals方法
                System.out.println(t1.equals(t3)); // true

                Test2 t4 = new Test2(30);
                Test2 t5 = new Test2(30);
                Test2 t6 = new Test2(40);
                System.out.println(t4.getAge() == t5.getAge()); // true   //对象中的覆盖了equals方法
                System.out.println(t4.getAge() == t6.getAge()); // false
                System.out.println(t4.equals(t6)); // true //覆盖了equals方法, 随便怎么比都是true
        }

}


作者: nate996    时间: 2015-5-4 18:34
学习了!
作者: 落魄逗比    时间: 2015-5-4 21:26
==比较值,equal比较的是内容
作者: 大可乐    时间: 2015-5-4 22:09
简单说 == 判断的是地址  equal是内容
作者: 魔蝎座    时间: 2015-5-4 22:26
学习到了
作者: 智远    时间: 2015-5-4 22:28
==在基本类型中比较值,在引用类型或对象中比较地址。
equals只能比较引用类型或对象。
在Object中,equals方法如下:
  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码

也就是说equals比较的也是引用类型或对象的地址
为什么比较引用类型或对象时一般都用equals呢?
因为它们都重写了Object中的equals,具有自己的比较方式。这就是有时我们在编写类时为什么要重写equals方法的原因了。
作者: 郑卫原    时间: 2015-5-4 22:36
学习了,又涨姿势了
作者: 雪风飞花    时间: 2015-5-4 22:38
==一般用于基本数据类型间的比较,引用数据类型比较的一般是地址,所以用equals
作者: 疯狂的大猫    时间: 2015-5-5 08:33
大可乐 发表于 2015-5-4 22:09
简单说 == 判断的是地址  equal是内容

简单明了
作者: 痲ボㄋ.    时间: 2015-5-5 08:46
学习了,说的很详细
作者: 追忆似水年华    时间: 2015-5-5 09:05
不错,顶一个。
作者: DonaldLove    时间: 2015-5-5 10:20
==就是比较是否为同一个对象,equal是比较内容是否相同。
作者: long-long    时间: 2015-5-5 10:26
涨姿势喽,都是好淫!
作者: 开到荼靡    时间: 2015-5-5 15:00
                public boolean equals(Object obj):
                        1.判断"两个对象"是否相等
                        2."=="是用来判断两个数值是否相等
                          "=="也可以用于对象判断",它是判断两个对象的地址否相等
                        3.equals()方法的默认实现,是比较两个对象的地址是否相同。相同返回true;
                        4.我们经常有这样的需求:判断两个对象中的属性值是否完全相同,如果两个对象的属性值完全相同,有时我们
                          会认为这两个对象是相等的。所以,此时我们可以利用equals()方法进行两个对象的属性值的判断;
作者: 猪猪fly侠    时间: 2015-5-5 15:05
吧友很给力讲解很详细
作者: 逍遥才子121    时间: 2015-5-5 16:27
了解了。。。
作者: 15059320049    时间: 2015-5-5 18:56
顶下 受教了





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