我们都知道Object的equals的比较其实就是==的比较,其实是内存中的存放地址的比较.正常逻辑上:类的每个实例本质上都是唯一的. 在工作中我们实际的业务逻辑往往有可能出现一些相对特殊的需求需要对equals方法进行重写,那么重写equals需要注意哪些规则或者通用的约定呢? equals方法实现了等价关系(equivalence relation): 自反性(reflexive).对于任何非null的引用值x,x.equals(x)必须返回true. 对称性(symmetric).对于任何…
如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equals实现正好符合. 2.不关心类是否提供了“逻辑相等”的测试功能. 例如Random类提供产生随机数的能力,如果覆盖equals,目的该是检查两个Random实例是否产生了相同的随机数列,但实际上这个比较功能是不需要的,所以从Object继承的equals是足够的. 3.超类已经覆盖了euqlas,…
第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和finalize)都有明确的通用约定(general contract),因为它们被设计成是要被覆盖(override)的.任何一个类,它在覆盖这些方法的时候,都有责任遵守这些通用的约定:如果不能做到这一点,其它依赖于这些约定的类(例如HashMap和HashSet)就无法结合该类一起正常运作. 覆盖equ…
为什么覆盖equals时,总要覆盖hashCode?   原因是,根据Object规范: 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的整数结果. 如果违反这个规定,那么,在使用应用了散列码的集合(HashMap,HashSet,Hashtable)时,就会出现问题.   也就是,两个相等的对象,必须要有相等的散列码(hashCode).两个对象,进行比较的时候,使用的关键域是一样的,然后,使用这些关键域作为参…
在覆盖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方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,HashSet,Hashtbale. hashCode约定内容: 1.只要对象equals方法的比较操作所用到的信息没有被修改,对同一对象调用多次,hashCode方法都必须返回同一整数.在同一应用程序的多次执行过程中,每次执行返回的整数可以不一致. 2.如果两个对象根据equals(Object)方法比较…
==是物理相等 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()方法需要被覆盖的情况:想要实现逻辑比较…
本文参考 本篇文章参考自<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类,每一个线程仅和自…
本文参考 本篇文章参考自<Effective Java>第三版第十一条"Always override hashCode when you override equals" You must override hashCode in every class that overrides equals hashCode()方法的通用约定如下: When the hashCode method is invoked on an object repeatedly during…