第8条:覆盖equals时遵守通用约定】的更多相关文章

如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equals实现正好符合. 2.不关心类是否提供了“逻辑相等”的测试功能. 例如Random类提供产生随机数的能力,如果覆盖equals,目的该是检查两个Random实例是否产生了相同的随机数列,但实际上这个比较功能是不需要的,所以从Object继承的equals是足够的. 3.超类已经覆盖了euqlas,…
本文参考 本篇文章参考自<Effective Java>第三版第十条"Obey the general contract when overriding equals" the conditions when each instance of the class is equal only to itself Each instance of the class is inherently unique -- 类的每一个实例本就彼此不同,例如Thread类,每一个线程仅和自…
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将近8年的时间,但随着Java 6,7,8,甚至9的发布,Java语言发生了深刻的变化. 在这里第一时间翻译成中文版.供大家学习分享之用. 10. 重写equals方法时遵守通用约定 虽然Object是一个具体的类,但它主要是为继承而设计的.它的所有非 final方法(equals.hashCode.toStr…
第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和finalize)都有明确的通用约定(general contract),因为它们被设计成是要被覆盖(override)的.任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定:如果不能做到这一点,其它依赖于这些约定的类(例如HashMap和HashSet)就无法结合该类一起正常运作. 覆盖equ…
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容:   equals方法实现了等价关系:   自反性.对于任何非null的引用值,x.equals(x)必须返回true. 对称性.对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true. 传递性.对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.…
覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自己相等.如果满足了一下任何一个条件,这都是所谓期望的结果: 类的每个实例的本质上都是唯一的.对于代表活动实体而不是值的类来说确实如此,例如Thread.Object提供的equals实现对于这些类来说正式正确的行为. 不关心类是否提供了"逻辑相等"的测试功能.例如java.u…
为什么覆盖equals时,总要覆盖hashCode?   原因是,根据Object规范: 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果. 如果违反这个规定,那么,在使用应用了散列码的集合(HashMap,HashSet,Hashtable)时,就会出现问题.   也就是,两个相等的对象,必须要有相等的散列码(hashCode).两个对象,进行比较的时候,使用的关键域是一样的,然后,使用这些关键域作为参…
==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键域相等,从而来判断这两实例是否相等. Object类的equals方法的实现:物理相等的话就逻辑相等. 什么时候不需要覆盖Object类的equals方法? 1.希望这个类的实例只能和自身相等,不覆盖equals方法,只继承Object类的equals方法. 我们比较这个类的实例对象是否相等,无论是…
Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只有一个2)不需要进行逻辑判断,只是单纯的比较内存地址是否相同3)父类覆盖了equals()方法,并且子类中完全够用4)类是私有的或者包级私有,equals()方法不会被调用.但是建议重写然后抛AssertionError(断言语句失败)异常 2.equals()方法需要被覆盖的情况:想要实现逻辑比较…
  重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以下任何一个条件,那就是正确的做法: 类的每个实例都是唯一的. 对于代表活动实体而不是值(value)的类来说确实如此,例如Thread.Object提供的equals实现对这些类具有完全正确的行为(The equals implementation provided by Object has ex…