【java编程】重写HashCode和equals方法
【一】重写equals方案的规则
equals方法本来的原则
1、类的每个实例本质上都是唯一的。
2、不关心类是否提供了“逻辑相等”的测试功能
3、超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的。
4、类是自有的活是包级私有的,可以确定equals方法永远不会被调用。这个时候就要重写,防止被外界调用。
equals方法实现了等价关系。
1、自反性:对于任何非null的引用值x.则必须满足x.equals(x)必须返回true
2、对称性:对于任何非null的引用x,y. x.equals(y)返回true,则y.equals(x)必须返回true
3、传递性:对于任何非null的引用x,y,z。则x.equals(y)返回true,y.equals(z)返回true.则x.equals(z)必须返回true
4、一致性:对于任何非null的引用x,y。只要对象里的信息没有被修改。x.equals(y)多次调用,要么一直返回true,要么一直返回false
5、对于任何非null的引用值x.x.equals(null)必须返回false
【二】重写hashCode方法的规则
覆盖了equals时,总要覆盖hashCode方法。
一个重写hashCode和equals的实例
import org.apache.commons.lang3.StringUtils; /**
*
*/
public final class Category {
private volatile int hashCode = 0;
private final boolean nullOrEmptyIsCached;
private final int initialCapacity;
private final long maxSize;
private final long timeOut;
private final String cacheKey; public Category(int initialCapacity, long maxSize, long timeOut, String cacheKey, boolean nullOrEmptyIsCached) {
this.initialCapacity = initialCapacity;
this.maxSize = maxSize;
this.timeOut = timeOut;
this.cacheKey = cacheKey;
this.nullOrEmptyIsCached = nullOrEmptyIsCached;
} @Override
public int hashCode() {
int internalHashCode = hashCode;
if (internalHashCode == 0) {
int nullOrEmptyIsCachedInt = nullOrEmptyIsCached ? 1 : 0;
internalHashCode = 31 * internalHashCode + nullOrEmptyIsCachedInt;
internalHashCode = 31 * internalHashCode + initialCapacity;
int mS = (int) (maxSize ^ (maxSize >>> 32));
internalHashCode = 31 * internalHashCode + mS;
int tO = (int) (timeOut ^ (timeOut >>> 32));
internalHashCode = 31 * internalHashCode + tO;
if (StringUtils.isNotEmpty(cacheKey)) {
internalHashCode = 31 * internalHashCode + cacheKey.hashCode();
}
hashCode = internalHashCode;
}
return internalHashCode;
} @Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Category)) {
return false;
}
Category otherCategory = (Category) obj;
return this.nullOrEmptyIsCached == otherCategory.nullOrEmptyIsCached && this.initialCapacity == otherCategory.initialCapacity && this.maxSize == otherCategory.maxSize && this.timeOut == otherCategory.timeOut && (this.cacheKey == null ? this.cacheKey == otherCategory.cacheKey : this.cacheKey.equals(otherCategory.cacheKey));
}
//省略sett,gett
}
【java编程】重写HashCode和equals方法的更多相关文章
- 关于java中的hashcode和equals方法原理
关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...
- 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- (转)为什么要重写 hashcode 和 equals 方法?
作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...
- HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法
之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...
- 为什么要重写hashcode和equals方法
我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...
- 重写hashcode和equals方法
重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...
- Java 重写 hashCode() 和 equals() 方法
1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...
- 【转】 如何重写hashCode()和equals()方法
转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...
- 如何重写hashCode()和equals()方法
hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...
随机推荐
- API网关 动态路由、监控、授权、安全、调度
1.API网关介绍 API网关是一个服务器,是系统的唯一入口.从面向对象设计的角度看,它与外观模式类似.API网关封装了系统内部架构,为每个客户端提供一个定制的API.它可能还具有其它职责,如身份验证 ...
- FASTQ 数据质量统计工具
主流工具: FastQC fqcheck readfq 拿到测序数据的第一步就是做质量控制 fqcheck之后得到的结果: 它会统计每条reads,按read 1-100位点计算每个位置的ACGTN含 ...
- Android之 RecyclerView,CardView 详解和相对应的上拉刷新下拉加载
随着 Google 推出了全新的设计语言 Material Design,还迎来了新的 Android 支持库 v7,其中就包含了 Material Design 设计语言中关于 Card 卡片概念的 ...
- 名称随id的变化而变化
$("#user_id").change(function () { var uid = $(this).val(); if (uid == '') { $("#user ...
- poj 1182 (带权并查集)
食物链 Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 71361 Accepted: 21131 Description ...
- linux 检查补丁包是否安装 名称 版本 release号
To determine whether the required packages are installed, enter commands similar to the following: # ...
- page上BeanId与ActionType中的ParameterId
今天遇到一件有意思的异常. 一个基于EO的VO在页面加载进来之后就CreateRow了一行数据,主键HeaderId也相应的插入了值,但是在保存的时候,老是报HeaderId不能为空的异常. 经查,页 ...
- jquery插件Loadmask
Loadmask是一个jquery plugin,使用此插件可以在DOM元素加载或更改内容时为此DOM元素添加一个屏蔽层,以防止用户互动,同时起到提醒用户后台任务正在运行的作用. 它可实现的效果:
- arc路径例子-磊哥
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> & ...
- html页面展示Json样式
一般有些做后台数据查询,要把后台返回json数据展示到页面上,如果需要展示样式更清晰.直观.一目了然,就要用到html+css+js实现这个小功能 一.css代码 pre {outline: 1px ...