hashCode和equals区别和作用.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
hashCode和equals区别和作用

HashSet和HashMap一直都是JDK中最常用的两个类,HashSet要求不能存储相同的对象,HashMap要求不能存储相同的键。? 那么Java运行时环境是如何判断HashSet中相同对象、HashMap中相同键的呢?当存储了“相同的东西”之后Java运行时环境又将如何来维护呢?? 在研究这个问题之前,首先说明一下JDK对equals Object obj 和hashcode 这两个方法的定义和规范:? 在Java中任何一个对象都具备equals Object obj 和hashcode 这两个方法,因为他们是在Object类中定义的。? equals Object obj 方法用来判断两个对象是否“相同”,如果“相同”则返回true,否则返回false。? hashcode 方法返回一个int数,在Object类中的默认实现是“将该对象的内部地址转换成一个整数返回”。? 接下来有两个个关于这两个方法的重要规范 我只是抽取了最重要的两个,其实不止两个 :? 规范1:若重写equals Object obj 方法,有必要重写hashcode 方法,确保通过equals Object obj 方法判断结果为true的两个对象具备相等的hashcode 返回值。说得简单点就是:“如果两个对象相同,那么他们的hashcode应该 相等”。不过请注意:这个只是规范,如果你非要写一个类让equals Object obj 返回true而hashcode 返回两个不相等的值,编译和运行都是不会报错的。不过这样违反了Java规范,程序也就埋下了BUG。? 规范2:如果equals Object obj 返回false,即两个对象“不相同”,并不要求对这两个对象调用hashcode 方法得到两个不相同的数。说的简单点就是:“如果两个对象不相同,他们的hashcode可能相同”。? 根据这两个规范,可以得到如下推论:? 1、如果两个对象equals,Java运行时环境会认为他们的hashcode一定相等。? 2、如果两个对象不equals,他们的hashcode有可能相等。? 3、如果两个对象hashcode相等,他们不一定equals。? 4、如果两个对象hashcode不相等,他们一定不equals。? 这样我们就可以推断Java运行时环境是怎样判断HashSet和HastMap中的两个对象相同或不同了。我的推断是:先判断hashcode是否相等,再判断是否equals。? 测试程序如下:首先我们定义一个类,重写hashCode 和equals Object obj 方法? Java代码 [java]?view plaincopy class?A @Override public?boolean?equals Object?obj System.out.println 判断equals ; return?false; @Override public?int?hashCode System.out.println 判断hashcode ; return?1; 然后写一个测试类,代码如下:? Java代码 [java]?view plaincopy public?class?Test public?static?void?main String[]?args Map A,Object ?map? ?new?HashMap A,?Object ; map.put new?A ,?new?Object ; map.put new?A ,?new?Object ; System.out.println map.size ; 运行之后打印结果是:? 判断hashcode? 判断hashcode? 判断equals? 2? 可以看出,Java运行时环境会调用new A 这个对象的hashcode 方法。其中:? 打印出的第一行“判断hashcode”是第一次map.put new A , new Object 所打印出的。? 接下来的“判断hashcode”和“判断equals”是第二次map.put new A , new Object 所打印出来的。? 那么为什么会是这样一个打印结果呢?我是这样分析的:? 1、当第一次map.put new A , new Object 的时候,Java运行时环境就会判断这个map里面有没有和现在添加的 new A 对象相同的键,判断方法:调用new A 对象的hashcode 方法,判断map中当前是不是存在和new A 对象相同的HashCode。显然,这时候没有相同的,因为这个map中都还没有东西。所以这时候hashcode

文档评论(0)

didala + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档