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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© laine 中级黑马   /  2015-5-4 17:05  /  3170 人查看  /  20 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

==和equal的区别

20 个回复

倒序浏览
解释一下==号,他比较的是一个对象在内存中的地址值,
比如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方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
回复 使用道具 举报
学习了。。
回复 使用道具 举报
本帖最后由 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
        }

}

回复 使用道具 举报
学习了!
回复 使用道具 举报
==比较值,equal比较的是内容
回复 使用道具 举报
简单说 == 判断的是地址  equal是内容
回复 使用道具 举报
学习到了
回复 使用道具 举报
==在基本类型中比较值,在引用类型或对象中比较地址。
equals只能比较引用类型或对象。
在Object中,equals方法如下:
  1. public boolean equals(Object obj) {
  2.         return (this == obj);
  3.     }
复制代码

也就是说equals比较的也是引用类型或对象的地址
为什么比较引用类型或对象时一般都用equals呢?
因为它们都重写了Object中的equals,具有自己的比较方式。这就是有时我们在编写类时为什么要重写equals方法的原因了。
回复 使用道具 举报 1 0
学习了,又涨姿势了
回复 使用道具 举报
==一般用于基本数据类型间的比较,引用数据类型比较的一般是地址,所以用equals
回复 使用道具 举报
大可乐 发表于 2015-5-4 22:09
简单说 == 判断的是地址  equal是内容

简单明了
回复 使用道具 举报
学习了,说的很详细
回复 使用道具 举报
不错,顶一个。
回复 使用道具 举报
==就是比较是否为同一个对象,equal是比较内容是否相同。
回复 使用道具 举报
涨姿势喽,都是好淫!
回复 使用道具 举报
                public boolean equals(Object obj):
                        1.判断"两个对象"是否相等
                        2."=="是用来判断两个数值是否相等
                          "=="也可以用于对象判断",它是判断两个对象的地址否相等
                        3.equals()方法的默认实现,是比较两个对象的地址是否相同。相同返回true;
                        4.我们经常有这样的需求:判断两个对象中的属性值是否完全相同,如果两个对象的属性值完全相同,有时我们
                          会认为这两个对象是相等的。所以,此时我们可以利用equals()方法进行两个对象的属性值的判断;
回复 使用道具 举报 1 0
吧友很给力讲解很详细
回复 使用道具 举报
了解了。。。
回复 使用道具 举报
感觉二楼比较厉害
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马