【一】重写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方法的更多相关文章

  1. 关于java中的hashcode和equals方法原理

    关于java中的hashcode和equals方法原理 1.介绍 java编程思想和很多资料都会对自定义javabean要求必须重写hashcode和equals方法,但并没有清晰给出为何重写此两个方 ...

  2. 为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  3. (转)为什么要重写 hashcode 和 equals 方法?

    作者丨hsm_computer cnblogs.com/JavaArchitect/p/10474448.html 我在面试Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候 ...

  4. HashMap中使用自定义类作为Key时,为何要重写HashCode和Equals方法

    之前一直不是很理解为什么要重写HashCode和Equals方法,才只能作为键值存储在HashMap中.通过下文,可以一探究竟. 首先,如果我们直接用以下的Person类作为键,存入HashMap中, ...

  5. 为什么要重写hashcode和equals方法

    我在面试 Java初级开发的时候,经常会问:你有没有重写过hashcode方法?不少候选人直接说没写过.我就想,或许真的没写过,于是就再通过一个问题确认:你在用HashMap的时候,键(Key)部分, ...

  6. 重写hashcode和equals方法

    重写hashcode和equals方法 简乐君 2019-05-07 21:55:43 35481 收藏 191分类专栏: Java 文章标签: equals() hashcode()版权 一.前言我 ...

  7. Java 重写 hashCode() 和 equals() 方法

    1. hashCode 1.1 基本概念 hashCode 是 JDK 根据对象的地址算出来的一个 int 数字(对象的哈希码值),代表了该对象再内存中的存储位置. hashCode() 方法是超级类 ...

  8. 【转】 如何重写hashCode()和equals()方法

    转自:http://blog.csdn.net/neosmith/article/details/17068365 hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它 ...

  9. 如何重写hashCode()和equals()方法

    hashCode()和equals()方法可以说是Java完全面向对象的一大特色.它为我们的编程提供便利的同时也带来了很多危险.这篇文章我们就讨论一下如何正解理解和使用这2个方法. 如何重写equal ...

随机推荐

  1. eclipse安装adt插件后工具栏不显示android相关图标

    到eclipse官网下载luna(开发android,推荐此版本,当前最新版4.4.2)版本的eclipse http://ftp.jaist.ac.jp/pub/eclipse/technology ...

  2. English trip -- Review Unit7 Shopping 购物

    Xu言: 今天,lamb老师帮我梳理的时候到时提醒了我件事,之前Jade老师也说过每个单元的课程其实有个大主题,我需要把这个单元上完以后全部好好的回顾,然后整理一下.把每个单元的主题以及主题(them ...

  3. 12月6日 看Active Record validation ; 做jdstore ,注意gem bootstrap 版本只支持bootstrap3。

    Active Record validation: new_record?()//用于验证刚新建,但没存入database中的数据 ,返回true或false persisted?() //和new_ ...

  4. scrapy微信爬虫使用总结

    scrapy+selenium+Chrome+微信公众号爬虫 概述 1.微信公众号爬虫思路: 参考:记一次微信公众号爬虫的经历 2.scrapy框架图 3.scrapy经典教程 参考: python ...

  5. VS2013/2015 html 设计视图窗口

  6. XML文档的读、写

    代码: XmlDocument doc = new XmlDocument(); doc.Load("Books.xml"); //1.加载要读取的XML文件 //要想看到数据得先 ...

  7. css中 font常用的样式属性

    今天我总结一下文本常用的字体样式 1.font常用样式 1)字体类型 语法:font-family: +字体类型:    如: font-family:宋体; 2)字体大小 语法:font-size: ...

  8. Windows各种各种消息投递函数

    1.SendMessage:发送消息给指定的窗口过程:直到窗口过程处理了消息才返回. 2.PostMessage:将消息放入消息队列(与指定窗口创建的线程相关)中:无需等待消息处理,立即返回.   不 ...

  9. PHP:第三章——PHP中嵌套函数和条件函数

    PHP中的嵌套函数: <?php header("Content-Type:text/html;charset=utf-8"); function A(){ echo &qu ...

  10. ACID测试标准

    缩写ACID代表原子性(atomicity).一致性(consistency).孤立性(isolation).持久性(duration) 通过了ACID测试的事物在多线程.并行处理或多用户环境中就是安 ...