前言
在Java语言中, equals()和hashCode()两个函数的运用是紧密配合的, 你要是自己设计其中一个, 就要设计另外一个。 在少数情
况
下, 这两个函数是不用思索的, 直接运用它们的默许设计就可以了。 但是在一些情况下, 这两个函数最好是自己设计, 才干确保整个顺序的正常运转。 最罕见的是当
一个对象被参与搜集对象(collection
object)时, 这两个函数必需自己设计。 更细化的定义是:如果你想将一个对象A放入另一个搜集对象B里, 或者运用这个对象A为查找一个元对象在搜集对
象B里位置的钥匙, 并支持是否容纳, 删除搜集对象B里的元对象这样的操作, 那么, equals()和hashCode()函数必需开发者自己定义。 其他情
况下, 这两个函数是不需求定义的。
equals
它是用于停止两个对象的比拟的, 是对象内容的比拟, 当然也能用于停止对象参阅值的比拟。 什么是对象参阅值的比拟?就是两个参阅变量的值得比拟,
我们
都知道参阅变量的值其实就是一个数字, 这个数字可以看成是鉴别不同对象的代号。 两个对象参阅值的比拟, 就是两个数字的比拟, 两个代号的比拟。 这种比拟是默
认的对象比拟方式, 在Object这个对象中, 这种方式就曾经设计好了。 所以你也不用自己来重写, 浪费不用要的工夫。
对象内容的比拟才是设计equals()的真正目的, Java语言对equals()的要求如下, 这些要求是必需遵循的。 否则, 你就不该浪费时
间:
对称性:如果x. equals(y)前往是“true”, 那么y. equals(x)也应该前往是“true”。
反射性:x. equals(x)必需前往是“true”。
类推性:如果x. equals(y)前往是“true”, 而且y. equals(z)前往是“true”, 那么z. equals(x)也应该返
回是“true”。
还有分歧性:如果x. equals(y)前往是“true”, 只要x和y内容一直不变, 不论你重复x. equals(y)多少次, 前往都是
“true”。
任何情况下, x. equals(null), 永远前往是“false”;x. equals(和x不同类型的对象)永远前往是“false”。
hashCode
这
个函数前往的就是一个用来停止赫希操作的整型代号, 请不要把这个代号和前面所说的参阅变量所代表的代号弄混了。 后者不仅仅是个代号还具有在内存中才查找对
象的位置的功能。 hashCode()所前往的值是用来分类对象在一些特定的搜集对象中的位置。 这些对象是HashMap, Hashtable,
HashSet, 等等。 这个函数和上面的equals()函数必需自己设计, 用来协助HashMap, Hashtable,
HashSet,
文胸 等等对自己所搜集的少量对象停止搜索和定位。
这些搜集对象究竟如何工作的, 想象每个元对象hashCode是一个箱子的
编码, 依照编码, 每个元对象就是根据hashCode()提供的代号归入相应的箱子里。 所有的箱子加起来就是一个HashSet, HashMap, 或
Hashtable对象, 我们需求寻觅一个元对象时, 先看它的代码, 就是hashCode()前往的整型值, 这样我们找到它所在的箱子, 然后在箱子里, 每
个元对象都拿出来一个个和我们要找的对象停止对比, 如果两个对象的内容相等, 我们的搜索也就结束。 这种操作需求两个重要的信息, 一是对象的
hashCode(), 还有一个是对象内容对比的结果。
hashCode()的前往值和equals()的关系如下:
如果x. equals(y)前往“true”, 那么x和y的hashCode()必需相等。
如果x. equals(y)前往“false”, 那么x和y的hashCode()有能够相等, 也有能够不等。