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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ._抬眉﹏ 中级黑马   /  2014-4-10 23:05  /  915 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在java中 ==是比较基本数据类型的值是否相等,还可以比较引用数据类型引用的内存地址是否相等,
但是equals是怎么比较的呢?看了源码,它说是只有当对象是同一个对象的时候才返回true
如下:Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

我在想既然是同一个对象那还比什么?
public class Equivalence {
public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1 == n2);
    System.out.println(n1 != n2);
}

false;true
是说明java内存中可以存在两个一样的对象
//: EqualsMethod.java

public class EqualsMethod {
public static void main(String[] args) {
    Integer n1 = new Integer(47);
    Integer n2 = new Integer(47);
    System.out.println(n1.equals(n2));
}
} ///:~
false


//: EqualsMethod2.java

class Value {
int i;
}

public class EqualsMethod2 {
public static void main(String[] args) {
    Value v1 = new Value();
    Value v2 = new Value();
    v1.i = v2.i = 100;
    System.out.println(v1.equals(v2));
}
} ///:~
false;

6 个回复

正序浏览
解释一下==号,他比较的是一个对象在内存中的地址值,
比如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方法具体的作用要看当前的那个类是如何实现重写父类中该方法的。如果没有重写该方法,那么他和==号等价。
回复 使用道具 举报
哦,我知道了,那个是我弄错了,谢谢了哦。
回复 使用道具 举报
equals默认是比较对象的内存地址值。如果我们要想按照内容进行比较。我们要自己去覆写equals方法。
回复 使用道具 举报
楼主,因为你比较的,
不是堆内存的对象,而只是在栈内存里面那个对象的引用而已。

程序一:
已经new出来两个Integer对象了,而不是同一样,所以是不相等。
但因为值相等,所以用equals还是返回true的。
是说明java内存中可以存在两个一样的对象”,我觉得严谨的说,应该是可以存包含内容一样的对象。

程序二:
应该是返回true而不是false,
Integer的equals方法:
比较此对象与指定对象。当且仅当参数不为 null,并且是一个与该对象包含相同 int 值的 Integer 对象时,结果为 true。

程序三:
你这样比较的是两个对象的地址,而不是它们里面的值,因此返回false。
如果想比较它们里面i的值,可以这样 ——


  1. public class Equivalence {
  2.         public static void main(String[] args) {
  3.                 Value v1 = new Value();
  4.                 Value v2 = new Value();
  5.                 v1.i = v2.i = 100;
  6.                 System.out.println(v1.getI() == v2.getI()); // true
  7.                 System.out.println(v1.getI().equals(v2.getI()));// 编译错误
  8.         }

  9. }

  10. class Value {
  11.         int i;
  12.         public int getI() {
  13.                 return this.i;
  14.         }
  15. }
复制代码












回复 使用道具 举报
  1. 而==则是指两个对象在内存块中的二进制值是否相等
复制代码
回复 使用道具 举报
  1. equals 方法是Object类中的一个方法,一般会被子类复写,像String类就复写了Object类的equals方法,String类的equals方法是比较的字符串的内容(建议查看String类源代码就一清二楚了),如果子类没有复写Object类的equals方法的话,那么Object类的equals方法是这样实现的,源代码: 

  2.  public boolean equals(Object obj) {
  3.  return (this == obj);
  4.     }

  5. 所以如果子类不重写equals方法的话,它就等价于==

  6. 明白了否?
复制代码
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马