学习:重写hashCode()方法的必要性

当一个类有可能会和其他类发生比较的时候,我们会重写equals方法,但大多数情况下,都忽略了重写hashCode方法。

这里说一下重写hashCode的必要性。

当我们使用HashSet或者HashMap的时候,在比对value|key是否存在时,会调用hashCode方法。

注意,hashSet的contains方法其实是依赖于HashMap的containsKey方法的。

我们来看下containsKey方法的实现:

  public boolean containsKey(java.lang.Object paramObject){return (getEntry(paramObject) != null);}final Entry<K, V> getEntry(java.lang.Object paramObject){int i = (paramObject == null) ? 0 : hash(paramObject.hashCode());Entry localEntry = this.table[indexFor(i, this.table.length)];for (; localEntry != null; localEntry = localEntry.next){if (localEntry.hash == i) { java.lang.Object localObject;if (((localObject = localEntry.key) == paramObject) || ((paramObject != null) && (paramObject.equals(localObject)))){return localEntry; } }}return null;}

 

由上面代码即可知,hashCode是重要的判断依据,没有重写hashCode,equals表现相等的两个类,它们的hashCode并不相等。

所以会导致containsKey方法返回false,测试代码如下:

包含HashCode的类:

package hashset.and.hashcode;public class ClassWithHashCode {public int i;public boolean equals(Object o) {if (o == this)return true;if (o instanceof ClassWithHashCode) {ClassWithHashCode code = (ClassWithHashCode) o;return code.i == i;}return false;}public int hashCode() {return i * 17 + 37;}
}

没有重写hasCode的类:

package hashset.and.hashcode;public class ClassWithoutHashCode {public int i;public boolean equals(Object o) {if (o == this)return true;if (o instanceof ClassWithoutHashCode) {ClassWithoutHashCode code = (ClassWithoutHashCode) o;return code.i == i;}return false;}
}

 

测试类:

package hashset.and.hashcode;import java.util.HashSet;public class Test {/*** @param args*/public static void main(String[] args) {ClassWithHashCode c1 = new ClassWithHashCode();ClassWithHashCode c2 = new ClassWithHashCode();c1.i = 0;c2.i = 0;HashSet<ClassWithHashCode> set = new HashSet<ClassWithHashCode>();set.add(c1);System.out.println(set.contains(c2));ClassWithoutHashCode co1 = new ClassWithoutHashCode();ClassWithoutHashCode co2 = new ClassWithoutHashCode();co1.i = 0;co2.i = 0;HashSet<ClassWithoutHashCode> set1 = new HashSet<ClassWithoutHashCode>();set1.add(co1);System.out.println(set.contains(co2));}
}

 

 

执行的结果为:

true
false

 

符合预期。证毕。

转载于:https://www.cnblogs.com/anrainie/archive/2012/04/27/2473196.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/409890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python利用缩进写模块_Python之缩进块

MySQL主从复制、半同步复制和主主复制概述 http://www.cnblogs.com/zping/p/5275531.html 17 任务调度相关类综述——Live555源码阅读&lpar;一&rpar;任务调度相关类 这是Live555源码阅读的第二部分,包括了任务调度相关的三个类.任务调度是Live555源码中很重要的部分. 本…

二进制安装mysql-5.7.26

一、上传二进制 mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz包 #/data 是数据盘 自己根据情况定 [rootVM_0_10_centos data]# pwd/datatar xf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gzmv mysql-5.7.26-linux-glibc2.12-x86_64 mysql #做软连接 ln -s /data/mysql /usr/lo…

[html] 块级元素不能包含其他块级元素有那些?

[html] 块级元素不能包含其他块级元素有那些&#xff1f; 嵌套规则&#xff1a;块级元素可以包含内联元素或某些块级元素&#xff0c;但内联元素不能包含块级元素&#xff0c;它只能包含其它内联元素。块级元素不能放在p里面。有几个特殊的块级元素只能包含内联元素&#xff0…

自组网中继台_同频自组网基站

随着社会的发展&#xff0c;应急处置部门对专网无线通讯的需求越来越强烈&#xff0c;优秀的无线通信系统能够帮助应急救援部门快速反应、高效工作。除了在城市等固定地区的无线通信外&#xff0c;应急救援部门在山区、丛林、荒漠、隧道、地下室等场景下的通讯一样非常重要。但…

INF DestinationDirs Section

INF DestinationDirs Section INF DestinationDirs Section格式如下&#xff1a; [DestinationDirs] [DefaultDestDirdirid[,subdir]] [file-list-sectiondirid[,subdir]]... 描述&#xff1a;该域记录了在INF文件的其他域中引用的需要复、删除、重命名的文所在的目录。 Defau…

python给矩阵赋值_解决Python二维数组赋值问题

解决Python二维数组赋值问题 当我们采用s[[0]*3]*2初始化一个数组&#xff0c;然后对s[0][0]进行赋值&#xff0c;改变的是第一列所有的值。因为用s [[0]*3]*2 初始化数组&#xff0c;他表示的是指向这个列表的引用&#xff0c;所以当你修改一个值的时候&#xff0c;整个列表都…

[html] a标签可以再嵌套a标签吗?为什么?如果不行,那又想要嵌套效果怎么解决呢?

[html] a标签可以再嵌套a标签吗&#xff1f;为什么&#xff1f;如果不行&#xff0c;那又想要嵌套效果怎么解决呢&#xff1f; a标签不能嵌套a标签<a href"https://www.baidu.com/" class"parent">点击父级标签<a href"https://www.baidu.c…

mysq5.7 主主同步

db01 172.21.0.10 db02 172.21.0.14 一、安装数据库看上一遍博客 修改配置文件 db01 172.21.0.10 [rootVM_0_10_centos mysql]# cat /etc/my.cnf [mysqld] port3306 character-set-serverutf8 basedir/usr/local/mysql datadir/usr/local/mysql/data #innodb_buffer_pool_…

代码整洁之道 python_Python代码整洁之道:编写优雅的代码

译者序前言致谢关于作者关于技术审校者第1章 关于Python的思考11.1 编写Python代码11.1.1 命名21.1.2 代码中的表达式和语句51.1.3 拥抱Python编写代码的方式81.2 使用文档字符串141.2.1 模块级文档字符串171.2.2 使类文档字符串具有描述性171.2.3 函数文档字符串181.…

python猜数字游戏实例_Python案例:猜数字小游戏,由浅入深!

本案例只适合新手&#xff0c;老司机请绕路。 游戏介绍&#xff1a;程序自己有一个数字&#xff0c;用户输入一个数字&#xff0c;两个数字进行比较。 可以学到的知识点&#xff1a;input函数、字符串、while循环、if条件判断语句、break语句。 一、 简单版 猜数字游戏&#xf…

PLSQL

每个语句可加“&#xff1b;”也可以不加“&#xff1b;”但是连在一起执行必须加“&#xff1b;”delete taccorequest;commit;select * from taccorequest;转载于:https://www.cnblogs.com/JackShao/archive/2012/04/30/2476942.html

基于DispatchProxy打造自定义AOP组件

DispatchProxy是微软爸爸编写的一个代理类&#xff0c;基于这个&#xff0c;我扩展了一个AOP组件 暂时不支持依赖注入构造方法&#xff0c;感觉属性注入略显麻烦&#xff0c;暂时没打算支持 基于特性的注入流程 [AttributeUsage(AttributeTargets.Method)]internal class TestA…

算法整理学习(二)

&#xff08;注&#xff1a;以下算法答案来自网络&#xff0c;自己整理供学习&#xff09; 3.约瑟夫循环报数出列顺序问题思路&#xff1a;采用循环链表&#xff0c;当然也可以采用数组&#xff0c;像模拟循环队列一样 //方法一&#xff1a; 采用找到一个节点删除一个节点的方式…

python判断ip能否ping通_使用Python测试Ping主机IP和某端口是否开放的实例

使用Python方法比用各种命令方便&#xff0c;可以设置超时时间&#xff0c;到底通不通&#xff0c;端口是否开放一眼能看出来。命令和返回完整权限&#xff0c;可以ping通&#xff0c;端口开放&#xff0c;结果如下&#xff1a;无root权限(省略了ping)&#xff0c;端口开放&…

python实现抓取网页上的内容并发送到邮箱

要达到的目的&#xff1a;从特定网页中抓取信息&#xff0c;排版后发送到邮箱中 关键点&#xff1a;下载网页&#xff0c;从网页里抓取出需要的信息HTML排版发送到指定邮箱 实现&#xff1a;1.python下载网页直接用库函数就可以实现from urllib import urlretrievefrom urllib …

Thinkphp 配置不用输入index.php

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 本文链接&#xff1a;https://blog.csdn.net/u011186019/article/details/78495461由&#xff1a;http://127.0.0.1/thinkphp/index.php/index/in…

ue4导入倾斜摄影_倾斜摄影建模干货|还怕搞不定CC空三?这里只要5分钟……

关注公众号"三维前沿"&#xff0c;持续获取更多操作技巧干货&#xff01;01Q&#xff1a;空三刚开始就失败&#xff1f;A&#xff1a;考虑以下4种情况&#xff1a;考虑ContextCapture Engine 是否打开&#xff0c;尝试关闭后重新打开&#xff1b;考虑相片数量是否过多…

[html] 如何禁止移动端的左右划动手势?

[html] 如何禁止移动端的左右划动手势&#xff1f; html{touch-action:none;touch-action:pan-y;}个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

python自增_python mysql自增字段AUTO_INCREMENT值的修改方式

在之前得文章中我们说过&#xff0c;如果使用delete对数据库中得表进行删除&#xff0c;那么只是把记录删除掉&#xff0c;并且id的值还会保持上次的状态。 即删除之前如果有四条数据&#xff0c;删除之后&#xff0c;再添加新的数据&#xff0c;id怎会从5开始。 但是我们显示想…

Python工具

1. sourcetree https://www.cnblogs.com/hoobey/p/7100593.html 2.pycharm 3. anaconda 转载于:https://www.cnblogs.com/ericazy/p/11498959.html