在Java里重写equals和hashCode要注意什么问题

问题:在Java里重写equals和hashCode要注意什么问题

重写equals和hashCode有哪些问题或者陷阱需要注意?

回答一

理论(对于语言律师或比较倾向于数学的人):

equals() (javadoc) 必须定义为一个相等关系(它必须是自发的,对称的并且是传递的),另外它一定是一致的(如果一个对象没有被修改,那么它一定返回相同的值)。而且 o.equals(null)一定要返回false

hashCode() (javadoc)一定要是一致的(如果一个对象没有按照equals修改的话,它一定保证返回一个相同的值)

这两个方法的关系是:

无论如何 a.equals(b),那么a.hashCode() 必须等于b.hashCode().

实际上:

如果你重写了其他一个,那么你必须要重写另外那个

使用计算equals()的一组相同字段去计算hashcode()

使用来自于Apache Commons Lang library的优秀工具类 EqualsBuilder and HashCodeBuilder

例如

public class Person {private String name;private int age;// ...@Overridepublic int hashCode() {return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers// if deriving: appendSuper(super.hashCode()).append(name).append(age).toHashCode();}@Overridepublic boolean equals(Object obj) {if (!(obj instanceof Person))return false;if (obj == this)return true;Person rhs = (Person) obj;return new EqualsBuilder().// if deriving: appendSuper(super.equals(obj)).append(name, rhs.name).append(age, rhs.age).isEquals();}
}

同时也要记住:

当你使用基于哈希的集合或者Map的时候例如:HashSet, LinkedHashSet, HashMap, Hashtable, or WeakHashMap,确定你放进去集合的key对象的hashcode()的值,在被放进去了集合以后就不再改变。确保这一点的可靠方法就是你的key保证不变,这也会带来其他好处的

文章翻译自Stack Overflow:https://stackoverflow.com/questions/27581/what-issues-should-be-considered-when-overriding-equals-and-hashcode-in-java

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

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

相关文章

vray阴天室内_阴天有话:第1部分

vray阴天室内When working with text data and NLP projects, word-frequency is often a useful feature to identify and look into. However, creating good visuals is often difficult because you don’t have a lot of options outside of bar charts. Lets face it; ba…

【codevs2497】 Acting Cute

这个题个人认为是我目前所做的最难的区间dp了,以前把环变成链的方法在这个题上并不能使用,因为那样可能存在重复计算 我第一遍想的时候就是直接把环变成链了,wa了5个点,然后仔细思考一下就发现了问题 比如这个样例 5 4 1 2 4 1 1 …

渐进式web应用程序_渐进式Web应用程序与加速的移动页面:有什么区别,哪种最适合您?

渐进式web应用程序Do you understand what PWAs and AMPs are, and which might be better for you? Lets have a look and find out.您了解什么是PWA和AMP,哪一种可能更适合您? 让我们看看并找出答案。 So many people own smartphones these days. T…

高光谱图像分类_高光谱图像分析-分类

高光谱图像分类初学者指南 (Beginner’s Guide) This article provides detailed implementation of different classification algorithms on Hyperspectral Images(HSI).本文提供了在高光谱图像(HSI)上不同分类算法的详细实现。 目录 (Table of Contents) Introduction to H…

在Java里如何给一个日期增加一天

在Java里如何给一个日期增加一天 我正在使用如下格式的日期: yyyy-mm-dd. 我怎么样可以给一个日期增加一天? 回答一 这样应该可以解决问题 String dt "2008-01-01"; // Start date SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd&q…

CentOS 7安装和部署Docker

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010046908/article/details/79553227 Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname …

JavaScript字符串方法终极指南-拆分

The split() method separates an original string into an array of substrings, based on a separator string that you pass as input. The original string is not altered by split().split()方法根据您作为输入传递的separator字符串,将原始字符串分成子字符串…

机器人的动力学和动力学联系_通过机器学习了解幸福动力学(第2部分)

机器人的动力学和动力学联系Happiness is something we all aspire to, yet its key factors are still unclear.幸福是我们所有人都渴望的东西,但其关键因素仍不清楚。 Some would argue that wealth is the most important condition as it determines one’s li…

在Java里怎将字节数转换为我们可以读懂的格式?

问题:在Java里怎将字节数转换为我们可以读懂的格式? 在Java里怎将字节数转换为我们可以读懂的格式 像1024应该变成"1 Kb",而1024*1024应该变成"1 Mb". 我很讨厌为每个项目都写一个工具方法。在Apache Commons有没有这…

ubuntu 16.04 安装mysql

2019独角兽企业重金招聘Python工程师标准>>> 1) 安装 sudo apt-get install mysql-server apt-get isntall mysql-client apt-get install libmysqlclient-dev 2) 验证 sudo netstat -tap | grep mysql 如果有 就代表已经安装成功。 3)开启远程访问 1、 …

shell:多个文件按行合并

paste file1 file2 file3 > file4 file1内容为: 1 2 3 file2内容为: a b c file3内容为: read write add file4内容为: 1 a read 2 b write 3 c add 转载于:https://www.cnblogs.com/seaBiscuit0922/p/7728444.html

form子句语法错误_用示例语法解释SQL的子句

form子句语法错误HAVING gives the DBA or SQL-using programmer a way to filter the data aggregated by the GROUP BY clause so that the user gets a limited set of records to view.HAVING为DBA或使用SQL的程序员提供了一种过滤由GROUP BY子句聚合的数据的方法&#xff…

leetcode 1310. 子数组异或查询(位运算)

有一个正整数数组 arr,现给你一个对应的查询数组 queries,其中 queries[i] [Li, Ri]。 对于每个查询 i,请你计算从 Li 到 Ri 的 XOR 值(即 arr[Li] xor arr[Li1] xor … xor arr[Ri])作为本次查询的结果。 并返回一…

大样品随机双盲测试_训练和测试样品生成

大样品随机双盲测试This post aims to explore a step-by-step approach to create a K-Nearest Neighbors Algorithm without the help of any third-party library. In practice, this Algorithm should be useful enough for us to classify our data whenever we have alre…

vue组件命名指南,不为取名而纠结

前言 自古中国取名文化博大进深,往往取一个好的名字而绞尽脑汁.那么一个好名字能够带来什么呢? 名字的内涵必需和使用者固有的本性相配套不和名人重名、不易重名、创意新颖,真正体现通过名字以区分人的作用响亮上口读起来流畅好听,协音美好,…

JavaScript 基础,登录验证

<script></script>的三种用法&#xff1a;放在<body>中放在<head>中放在外部JS文件中三种输出数据的方式&#xff1a;使用 document.write() 方法将内容写到 HTML 文档中。使用 window.alert() 弹出警告框。使用 innerHTML 写入到 HTML 元素。使用 &qu…

使用final类的作用是什么?

问题&#xff1a;使用final类的作用是什么&#xff1f; 我在看一本关于Java的书&#xff0c;它里面说你可以定义一个类为final。我搞不明白有什么地方会被用到这样。 我是一个编程萌新。我想知道程序员在他们的程序里面都是怎么用fianl类的。如果知道他们是什么时候使用的话&…

photoshop cc_如何使用Photoshop CC将图片变成卡通

photoshop ccA fun photo effect is to make a photo look like a cartoon. In this tutorial you will learn how to use Photoshop CC to make a photo look like a cartoon drawing.有趣的照片效果是使照片看起来像卡通漫画。 在本教程中&#xff0c;您将学习如何使用Photos…

从数据角度探索在新加坡的非法毒品

All things are poisons, for there is nothing without poisonous qualities. It is only the dose which makes a thing poison.” ― Paracelsus万物都是毒药&#xff0c;因为没有毒药就没有什么。 只是使事物中毒的剂量。” ― 寄生虫 执行摘要(又名TL&#xff1b; DR) (Ex…

Android 自定义View实现QQ运动积分抽奖转盘

因为偶尔关注QQ运动&#xff0c; 看到QQ运动的积分抽奖界面比较有意思&#xff0c;所以就尝试用自定义View实现了下&#xff0c;原本想通过开发者选项查看下界面的一些信息&#xff0c;后来发现积分抽奖界面是在WebView中展示的&#xff0c;应该是在H5页面中用js代码实现的&…