覆盖equals 时总要覆盖hashCode(9)
1、在每个覆盖了equals 方法的类中,也必须覆盖hashCode
- 这是关于hashCode 的通用约定
- 这样可以与 基于散列的集合一起工作,比如:HashMap、HashSet、HashTable
2、Object 规范:
- 在应用程序执行期间,equals 比较的信息不变,对同一对象多次调用,hashCode 返回同一整数
- 在同一应用程序的多次执行中,hashCode 返回整数可以不一致
- 两个对象equals 比较相等,hashCode 必须相等
- 两个对象equals 不等,hashCode不一定不等
- 不等的hashCode会提高散列集合的性能
3、相等的对象必须有相等的hashCode
- 散列集合中,先比较hashCode ,相等才做equals 比较
- 编写一个合法,但不好用的hashCode 是没有任何意义 ,如下:
- 散列表退化为链表
4、好的散列函数,倾向于(不保证):为每一个不等的对象产生不等的hashCode
- 对每一个关键域(equals 方法比较的域),都做散列计算,并且合并为一个
- 对于冗余域(equals 比较没用到的域),必须排除在外
- 如果一个类包含多个相似的域,用乘法计算散列值效果会更好
- 如下,但会一个简单的、确定的结果
5、对于不可变类,计算hashCode 消耗大,可以考虑缓存hashCode
6、如果某类型大多数对象都会用作散列键,可以创建时就计算hashCode
- 否则,可以考虑延时计算hashCode
7、不要在计算hashCode 的时候 排除掉对象的关键部分 来提升性能
- 这里省事,可能会导致hashCode 不起作用
8、不要在程序中,依赖hashCode返回的确定值
- 这样会限制在以后版本改进hashCode 函数的能力
转载于:https://my.oschina.net/u/3847203/blog/1818445
覆盖equals 时总要覆盖hashCode(9)的更多相关文章
- Item 9 覆盖equals时总要覆盖hashCode
为什么覆盖equals时,总要覆盖hashCode? 原因是,根据Object规范: 如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCod ...
- 覆盖equals时总要覆盖hashCode
本文涉及到的概念 1.为什么重载equals方法时,要重载hashCode函数;没有重载hashCode带来的问题 2.一个对象hashCode的生成规则 1.为什么重载equals方法时 ...
- 第9条:覆盖equals时总要覆盖hashCode
在每个覆盖equals方法的类中,也必须覆盖hashCode方法.否则,会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的集合一起正常工作,包括HashMap,Hash ...
- Effective Java —— 覆盖equals时总要覆盖hashCode
本文参考 本篇文章参考自<Effective Java>第三版第十一条"Always override hashCode when you override equals&quo ...
- 覆盖equals()时总要覆盖hashCode()
覆写如下: public class User{ private Integer id; private String userName; private String passWord; publi ...
- 【Effective Java】5、覆盖equals时总要覆盖hashcode
package cn.xf.cp.ch02.item9; import java.util.HashMap; import java.util.Map; public class PhoneNumbe ...
- EffectiveJava(9)覆盖equals是总要覆盖hashCode
覆盖equals是总要覆盖hashCode 通过散列函数将集合中不相等的实例均匀的分布在所有可能的散列值上 1.把某个非零的常数值保存在一个名为result的int类型变量中 2.对于对象中每个关键域 ...
- 第8条:覆盖equals时遵守通用约定
如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equa ...
- Item 8 覆盖equals时请遵守通用约定
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容: equals方法实现了等价关系: 自反性.对于任何非null的引用值,x.eq ...
随机推荐
- 使用Azure Rest API获得Access Token介绍
背景 本文主要介绍如何获取如何获取Azure Rest API的访问token,所采用的是v2.0版本的Microsoft标识平台,关于1.0和2.0的区别可以参考 https://docs.azur ...
- flaks-自定义url转换器
flaks-自定义url转换器 from flask import Flask, url_for from werkzeug.routing import BaseConverter app = Fl ...
- 切片-list、字符串
切片-list.字符串 1.字符串,切片顾头不顾尾 s="123455" print(s[0:3]) 结果:123 2.list d=[12,34,45] print(d[: ...
- ps 命令显示不完整的问题
今天在使用ps命令的时候,无法查找到指定名字的进程ID,仔细查找才发现ps命令查找的结果中进程启动的命令以及参数信息被截断了 问题实例 用户wanng启动了一个进程 wanng_qytrunkcros ...
- 假的数论gcd,真的记忆化搜索(Codeforce 1070- A. Find a Number)
题目链接: 原题:http://codeforces.com/problemset/problem/1070/A 翻译过的训练题:https://vjudge.net/contest/361183#p ...
- 深入理解new运算符
在 JavaScript 中,new 运算符创建一个用户定义的对象类型的实例或具有构造函数的内置对象的实例.创建一个对象很简单,为什么我们还要多此一举使用 new 运算符呢?它到底有什么样的魔力? 认 ...
- Jmeter连接mysql数据库?so easy!!!
一.确保mysql数据库能够通过Navicat等远程连接工具连接. 注意:一定是确保能使用navicat连接,而不是dos窗口! 比如笔者需要查询ecshop数据库下的ecs_admin_user表, ...
- Docker-Bridge Network 03 自定义网络
本节介绍自定义bridge network的自定义网络. 1.前言2.创建自定义网络2.1 创建网络2.2 指定网段创建网络3.创建容器3.1 指定网络创建容器3.2 指定IP创建容器4.通信4.1 ...
- 漫谈LiteOS-端云互通组件-MQTT开发指南(上)
1.介绍 SDK简介 Agent Tiny是部署在具备广域网能力.对功耗/存储/计算资源有苛刻限制的终端设备上的轻量级互联互通中间件,您只需调用API接口,便可实现设备快速接入到物联网平台以及数据上报 ...
- Youtube推荐算法的前世今生
第一阶段,基于User-Video图游历算法,2008年[1]. 在这个阶段,YouTube认为应该给用户推荐曾经观看过视频的同类视频,或者说拥有同一标签的视频.然而此时,YouTube的视频已是数千 ...