Java Tips -- About "equals"

原创 2006年06月01日 14:37:00

Key words: equals方法的写法

比如我自己写了一个类,Point,顾名思义地表示“点”。类属性x、y表示坐标。

Point a = new Point(1,1);
Point b = new Point(1,1);

显然,a!=b,大家都知道a、b只是对象的引用(Object reference),a==b仅在他们指向同一个对象的情况下才成立。

但大家倾向于认为a.equals(b)是成立的。

下面给出一个override这个equals方法的推荐写法:

    public boolean equals(Object o) {
        if (o == this) return true;//如果恰巧指向同一个对象,当然相等。
        if (o == null) return false;
        if (this.getClass() != o.getClass()) return false;
        Point p = (Point)o;
        return x == p.getX() && y = p.getY();
    }

注意红色部分,有人倾向于采用下面一句话代替(此时很幸运的是无需再判断o是否为null):
if (!(o instanceof Point)) return false;

但这样做有问题!

比如,如果o是Point子类(比如ColorPoint)的对象,o instanceof Point是成立的,于是可能造成这样的现象:
“黑白点”认为“彩色点”跟自己相等,但“彩色点”从他的角度根本不以为然。

出现的问题可能有:1 语义上有些问题;2 违反了equals的“对称性、传递性”等原则。

当然,不存在继承关系的情况下,采用instanceof的判断是没有问题的;不过,还是推荐使用上面黑体字的那段更加稳妥的代码。

参考文献:

Joshua Bloch<Effective Java>

Peter Haggar<Practical Java>

Java中==号与equals()方法的区别

==号和equals()方法都是比较是否相等的方法,那它们有什么区别和联系呢? 首先,==号在比较基本数据类型时比较的是值,而用==号比较两个对象时比较的是两个对象的地址值:int x = 10; ...
  • StriverLi
  • StriverLi
  • 2016年11月01日 17:29
  • 1883

java中 equals()方法 与 “==”的区别

摘要java语言的 equals() 方法 与 “==” 的区别,是每个初学者都会遇到过的问题。之前自己也很清楚,可日子一长,又渐渐遗忘,于是整理出一篇博客,复习一下。...
  • echosilly
  • echosilly
  • 2016年06月26日 18:04
  • 2308

Java 中 Equals和==的区别

在谈论equals和==的区别前,我们先简单介绍一下JVM中内存分配的问题。 在JVM中 内存分为栈内存和堆内存。二者有什么区别呢? 当我们创建一个对象(new Object)时,就会调用它的构造函数...
  • tcytcy123
  • tcytcy123
  • 2016年03月09日 16:19
  • 15717

Java中的equals和hashCode方法详解

Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用。 e...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014年04月01日 16:15
  • 53206

Java学习从菜鸟变大鸟之一 hashCode()和equals()的本质区别和联系

equals()是判读两个Set是否相等[前提是equals()在类中被覆盖]。==决定引用值是否指向同一对象。 1、当向集合set中增加对象时,首先计算要增加对象的hashCode码,根据该值来得到...
  • lishehe
  • lishehe
  • 2014年01月28日 11:43
  • 5542

面试基础整理(一)---Java中==和equals的区别

最近开始回头复习Java基础内容,在遇到==这个关系运算符和equals运算符时,发现了很多有趣的现象。 代码如下: //基本数据类型的比较 int num1 = 10;...
  • chance2015
  • chance2015
  • 2016年05月16日 19:02
  • 3010

什么时候应该用equals(),什么时候应该用==

本人小白一枚最近这一部分比较晕,所以自己就仔细研究了一下 我结合网上和自己的理解总结了一些,如果我说的有问题,也请大家及时提醒,不足或漏说的地方愿大家积极 补充以供更多小白得到帮助,在此谢谢大家了! ...
  • fox_bert
  • fox_bert
  • 2016年02月12日 13:37
  • 1241

Java中==和equals的区别,equals和hashCode的区别

==是运算符,用于比较两个变量是否相等。 equals,是Objec类的方法,用于比较两个对象是否相等,默认Object类的equals方法是比较两个对象的地址,跟==的结果一样。Object的eq...
  • tiantiandjava
  • tiantiandjava
  • 2015年07月21日 17:01
  • 18847

java的HashCode equals == 以及hashMap底层实现深入理解

java语言中的: 1.等号(==): 2.equals 3.hashCode 4.HashMap和HashSet源码分析
  • silviakafka
  • silviakafka
  • 2015年03月11日 17:34
  • 1514

==和equals的区别 null和""的区别

java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号(...
  • ItJavawfc
  • ItJavawfc
  • 2015年01月13日 11:03
  • 1446
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java Tips -- About "equals"
举报原因:
原因补充:

(最多只允许输入30个字)