Java对象的equals()和hashCode()的使用.docx

Java对象的equals()和hashCode()的使用.docx

  1. 1、本文档共3页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
前言 在 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()有可能相等, 也有可能不等。 为什么这两个规则是这样的,原因其实很简单,拿 HashSet 来说吧,HashSet 可以拥有一个或更多的箱子,在同一个箱子中可以有一个 或更多的独特元对象 (HashSet 所容纳的必须是独特的元对象)。这个例子说明一个元对象可以和其他不同的元对象拥有相同的 hashCode。但是一个 元对象只能和拥有同样内容的元对象相等。所以这两个规则必须成立。 设计这两个函数所要注意到的: 如果你设计的对象类型并不使用于收集性对象,那么没有必要自己再设计这两个函数的处理方式。这是正确的面向对象设计方法,任何用户一时用不到的功能,就先不要设计,以免给日后功能扩展带来麻烦。 如果你在设计时想别出心裁,不遵守以上的两套规则,那么劝你还是不要做这样想入非非的事。我还没有遇到过哪一个开发者和我说设计这两个函数要违背前面说的两个规则,我碰到这些违反规则的情况时,都是作为设计错误处理。 当一个对象类型

文档评论(0)

tianya189 + 关注
官方认证
内容提供者

该用户很懒,什么也没介绍

认证主体阳新县融易互联网技术工作室
IP属地上海
统一社会信用代码/组织机构代码
92420222MA4ELHM75D

1亿VIP精品文档

相关文档