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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马杨晨 中级黑马   /  2012-9-19 20:47  /  4194 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

equals底层比较的是什么?是址值还是什么?

7 个回复

倒序浏览
你要看是那个equals,因为所有类都继承自object,所以都有equals方法,每个具体的类自己根据功能定义的是不一样的
回复 使用道具 举报
个人理解啊!!
equals比较的是两块内存中存放的数据内容是否相同。 仅仅是比较内容是否相同,而“==”号比较的是在内存中的地址值是否相同
回复 使用道具 举报
源码面前了无秘密。

eq.png (1.54 KB, 下载次数: 150)

eq.png
回复 使用道具 举报
在object类中equals比较的是内存地址值
所有的类都继承自object,有的类就覆写了equals方法,例如 string类,它的equals比较的是字母
回复 使用道具 举报
具体的情况可以参见JavaAPI,里面有详细的介绍:
public boolean equals(Object obj)
指示其他某个对象是否与此对象“相等”。
equals 方法在非空对象引用上实现相等关系:

自反性:对于任何非空引用值 x,x.equals(x) 都应返回 true。
对称性:对于任何非空引用值 x 和 y,当且仅当 y.equals(x) 返回 true 时,x.equals(y) 才应返回 true。
传递性:对于任何非空引用值 x、y 和 z,如果 x.equals(y) 返回 true,并且 y.equals(z) 返回 true,那么 x.equals(z) 应返回 true。
一致性:对于任何非空引用值 x 和 y,多次调用 x.equals(y) 始终返回 true 或始终返回 false,前提是对象上 equals 比较中所用的信息没有被修改。
对于任何非空引用值 x,x.equals(null) 都应返回 false。
Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。

注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。
回复 使用道具 举报
这个问题貌似天天有啊...
equals()是Object中定义的,所有的类都有这个方法,

Object是这样定义的
public boolean equals(Object obj)
{
return (this == obj);
}
这里 == 就不用说了,是判断引用是否相同。

但是实际情况中,需要比较两个对象内容是否相同,这里有两个长的一样的东西,
而不是判断是不是一个对象,这里只有一个东西。

所以Java自带的类大部分(我还没发现哪个不是)都重写了equals(),
      怎么重写的?判断两个对象的类型,判断两个对象的内容。一致就返回true。
为什么我们也重写,因为咱们自定义的类用的还是Object类的“==”,
      规则是我们自己定义的,下面这个Person类,比较的是不是同一类型和name属性是否一致

  1. public class Person{
  2. private String name;
  3. public Person(String name)
  4. {
  5. this.name=name;
  6. }
  7. public boolean equals(Object o)
  8. {
  9.   if (!o instanceof Person) return false;
  10.   final Person other=(Person)o;
  11.   if (this.name().equals(other.name()))
  12.    return true;
  13.   else
  14.    return false;
  15. }
复制代码
回复 使用道具 举报
如果一个类没有自己定义equals方法,那么它将继承Object类的equals方法,Object类的equals方法的实现代码如下:

boolean equals(Object o){

return this==o;

}

这说明,如果一个类没有自己定义equals方法,它默认的equals方法(从Object 类继承的)就是使用==操作符,也是在比较两个变量指向的对象是否是同一对象,这时候使用equals和使用==会得到同样的结果,如果比较的是两个独立的对象则总返回false。如果你编写的类希望能够比较该类创建的两个实例对象的内容是否相同,那么你必须覆盖equals方法,由你自己写代码来决定在什么情况即可认为两个对象的内容是相同的。我们所学的一些常见类 一般都有自己的覆写equals方法,例如String类就覆写了equals方法,比较的是两个字符串的内容是否相等。

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马