不需要重写equals方法:

1.     一个类的每一个实例本质上都是唯一的。

2.     不关心一个类是否提供了“逻辑相等”的测试功能

3.     超类已经改写了equals方法,并且从超类继承过来的行为对于子类也是合适的。

4.     一个类时私有的或者是package私有的,并且可以确定它的equals方法永远不会被调用。(这种情况下最好将equals方法改写成以下方式:

public boolean equals(Object obj){

throws new UnsupportOperationException();
        }

只有当一个类有自己特定的“逻辑相等”概念,而且超类也没有改写equals以实现期望的行为,我们需要改写equals方法。通常适用于“值类”。

    在改写equals方法时,也要遵守他们的通用约定(equals方法实现了等价关系):

1.     自反性:x.equals(x) = true;

2.     对称性:如果有x.equals(y) = true,那么一定有y.equals(x) = true;

3.     传递性:对任意的x,y,z。如果有x.equals(y) = y.equals(z) = true,那么一定有x.equals(z)= true;

4.     一致性:无论多少次调用,x.equals(y)总会返回相同的结果。

5.     非空性(暂定):所有的对象都必须!=null;

  具体实现:

1.     使用==操作符检查“实参是否为指向对象的一个引用”,如果是则返回true;

2.     使用instanceof操作符检查“实参是否为正确的类型”,如果不是,则返回false;

3.     将实参换为正确的类型;

4.     对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域是否匹配。如果所有测试都成功,则返回true,否则返回false。

5.     方法完成之后,确定equals方法的对称性,传递性,一致性。

  注意:
        1.改写equals方法的时候,必须改写hashCode方法;

2.不要把equals声明中的Object对象替换为其他类型;

    public boolean equals(Object obj){

      //To do

     }

  hashCode的通用约定如下:

1.     只要对象equals方法涉及到的关键域内容不改变,那么这个对象的hashCode总是返回相同的整数。

    (如果关键域内容改变,则hashCode返回的整数就可以改变)。

2.     如果两个对象的equals(Object obj)方法时相等的,那么调用这两个对象中的任意一个对象的hashCode方法必须产生相同的整数结果。

    如果两个对象equals方法不同,那么必定返回不同的hashCode整数结果。(即相等的对象必须有相等的hashCode);

  产生hashCode的方法:

1.     把某个非零常数值保存在一个叫做result的int类型的变量中

2.     为该对象中的每一个关键域f计算int类型的散列码。

a)      为该域计算int类型的散列码c:

i.如果域是Boolean类型,计算:(f?0:1)

                ii.如果是byte,char,short,int类型,计算:(int)f

                iii.如果是long类型,计算:(int)(f^(f>>32))

                iv.如果是float类型,计算:Float.floatToIntBits(f)

                v.如果是double类型,计算Double.doubleToLongBits(f)得到long类型的值,在按照long值对待,继续进一步计算

                vi.如果是对象引用,递归调用hashCode方法计算,如果遇到为null的关键域,则返回0

                vii.如果是数组,将每一个元素都当做单独的域来计算,递归应用上述规则 

b)      按照下面公式,将得到的散列码c组合到result中

result = 37*result + c;

3.     return result;

4.     写完之后,检查hashCode方法是否能够让相等的实例产生相等的散列码,出错需要找出错误原因。

HIT2019春软件构造->重写hashCode()方法的更多相关文章

  1. HIT2019春软件构造->Git&Github学习笔记

    由于软件构造课程需要,学习使用git,以下作为学习笔记. 一.Git初始化及仓库创建和操作  1.基本信息设置(设置签名)  命令        项目级别/仓库级别:仅在当前本地库范围内有效 git ...

  2. HIT2019春软件构造->正则表达式语法

    普通字符:匹配与之相同的字符        字母.数字.汉字.下划线.没有特殊定义的标点符号. 简单的转义字符: \n 换行符 \t 制表符 \\ 代表\本身 \^,\$,\.,\(,\),\{,\} ...

  3. 为什么重写equals时必须重写hashCode方法?

    原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现Stri ...

  4. 重写equals()方法时,需要同时重写hashCode()方法

    package com.wangzhu.map; import java.util.HashMap; /** * hashCode方法的主要作用是为了配合基于散列的集合一起正常运行,<br/&g ...

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

    我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写 ...

  6. 为什么重写equals时必须重写hashCode方法?(转发+整理)

    为什么重写equals时必须重写hashCode方法? 原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html ...

  7. Effective Java 第三版——11. 重写equals方法时同时也要重写hashcode方法

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  8. JAVA中重写equals()方法的同时要重写hashcode()方法

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true:注意:当此方法 ...

  9. 讲解:为什么重写equals时必须重写hashCode方法

    一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...

随机推荐

  1. Redis批量导入数据的方法

    有时候,我们需要给redis库中插入大量的数据,如做性能测试前的准备数据.遇到这种情况时,偶尔可能也会懵逼一下,这里就给大家介绍一个批量导入数据的方法. 先准备一个redis protocol的文件( ...

  2. 利用ResultFilter实现asp.net mvc 页面静态化

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  3. Easy methods to select MB Star, Extremely MB Star, MB SD C4, Mercedes BENZ C5 SD

    MB Star, Extremely MB SD Connect C4, MB SD C4, Mercedes BENZ C5 SD are usually analysis tools to get ...

  4. 通过Shell脚本将VSS项目批量创建并且提交迁移至Gitlab

    脚本运行环境:Git Bash 系统环境:Windows 10 Pro 1709 VSS版本:Microsoft Visual SourceSafe 2005 我的VSS工作目录结构如下: D:\wo ...

  5. day12函数,三元表达式 ,列表推导式 ,字典推导式,函数对象,名称空间与作用域,函数的嵌套定义

    复习 # 字符串的比较 # -- 按照从左往右比较每一个字符,通过字符对应的ascii进行比较 # 函数的参数 # 1)实参与形参: # -- 形参:在函数定义时()中出现的参数 # -- 实参:在函 ...

  6. nodejs-使用multer实现多张图片上传,express搭建脚手架

    nodejs-使用multer实现多张图片上传,express搭建脚手架 在工作中,我们经常会看到用户有多张图片上传,并且预览展示的需求.那么在具体实现中又该怎么做呢? 本实例需要nodejs基础,本 ...

  7. Python 框架化代码的学习

    1 def 1: 2 pass 3 4 def 2: 5 pass 6 7 def 3: 8 pass 从Python初学我们习惯的风格就是如上图,把函数方法直接放到全局来写,这的确是最简单易懂的方式 ...

  8. tree与GridView交互

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="OgGridView.asp ...

  9. JS(JavaScript)的初了解8(更新中···)

    1.函数都有返回值…… 而方法的本质也是函数,所以也有返回值. Document.getElementById() 返回的是获取的标签 getElementsByClassName()和getElem ...

  10. 【新特性】JDK10

    一.局部变量类型推断 很多人抱怨Java是一种强类型,需要引入大量的样板代码.甚至在这些情况下,给定好变量名,通常很清楚发生了什么,明显类型声明往往被认为是不必要的.许多流行的编程语言都已经支持某种形 ...