文档章节

重写equals和hashCode方法的示例

囚徒困境
 囚徒困境
发布于 2015/03/01 23:24
字数 357
阅读 202
收藏 11
点赞 0
评论 0

如果一个类有自己特有的“逻辑相等”,且需要以此进行比较时,那么就需要重写equals方法。

在Object的规范中,重写equals方法有下面几条通用约定:

  • 自反性。 x.equals(x) == true

  • 对称性。if   y.equals(x) == true , then  x.equals(y) == true

  • 传递性。if   x.equals(y) == true y.equals(x) == true , then x.equals(z) == true

  • 一致性。如果比较的对象没有被修改,那么多次调用equals方法返回的结果应该相同


有个示例对象如下:

public class Book {
	private long id;
	private String name;
	private boolean isPublished;
}

那么重写的equals方法示例如下:

@Override
	public boolean equals(Object obj) {
		if( !(obj instanceof Book))
			return false;
		Book b = (Book) obj;
		return b.id == id 
				&& b.isPublished == isPublished 
				&& (b.name == name || (b != null && b.equals(b.name)) );
	}



在重写了equals方法的类中,如果不重写hashcode方法,则所有基于hash的集合就没法正常使用。

重写hashCode方法示例如下:

@Override
	public int hashCode() {
		int hashCode = 3;
		hashCode = 31 * hashCode + (int)(id ^ (id>>>32));
		hashCode = 31 * hashCode + (name == null?0:name.hashCode());
		hashCode = 31 * hashCode + (isPublished?1:0);
		return hashCode;
	}



如果这个类是不可变的,并且hashCode比较耗性能,则可以考虑缓存hashCode的值。

示例如下:

        //使用volatile保证可见性
        private volatile int hashCodeCache;
	
	@Override
	public int hashCode() {
		int hashCode = hashCodeCache;
		if(hashCode == 0){
			hashCode = 3;
			hashCode = 31 * hashCode + (int)(id ^ (id>>>32));
			hashCode = 31 * hashCode + (name == null?0:name.hashCode());
			hashCode = 31 * hashCode + (isPublished?1:0);
			hashCodeCache = hashCode;
		}
		return hashCode;
	}


© 著作权归作者所有

共有 人打赏支持
囚徒困境
粉丝 13
博文 25
码字总数 11216
作品 0
深圳
程序员
Java 中的hashCode()和equals()

此两个方法是从Object 类继承而来的,大多数时间我们都要重写这两个方法,以下是它们之间的说明: 从Object 继承过来hasCode()取得的是当前对象的内存地址的int 映射(将内存地址映射为一个int...

idoz ⋅ 2011/12/10 ⋅ 0

Java equals()和hashCode()

一、引言 Java技术面试的时候我们总会被问到这类的问题:重写equals()方法为什么一定要重写hashCode()方法?两个不相等的对象可以有相同的散列码吗?... 曾经对这些问题我也感到很困惑。 eq...

JackieYeah ⋅ 2014/03/27 ⋅ 0

重写equals和hashCode

1、equals和hashcode方法都来自Object对象。 API文档中HashCode和equals方法定义 public int hashCode() 返回该对象的哈希码值。支持此方法是为了提高哈希表性能。hashCode的常规协定是 publ...

kukudeku ⋅ 2016/08/24 ⋅ 0

hashCode() 和 equals()

第1部分 equals() 的作用 equals() 的作用是 用来判断两个对象是否相等。 equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源...

小菜鸡1 ⋅ 2016/08/17 ⋅ 0

hashcode和equals

若两个对象equals相等(重写了equals方法),但不在一个区间(没有重写hashcode方法),因为hashCode的值在重写之前是对内存地址计算得出,所以根本没有机会进行比较,会被认为是不同的对象。所...

WJobs ⋅ 06/15 ⋅ 0

Java hashCode() 和 equals()的若干问题解答

本章的内容主要解决下面几个问题: 1、 equals() 的作用是什么? 2 、equals() 与 == 的区别是什么? 3、 hashCode() 的作用是什么? 4 、hashCode() 和 equals() 之间有什么联系? 第1部分 ...

刘诗书 ⋅ 2017/11/27 ⋅ 0

我理解的== 、equals 、hashcode

先来回顾一下 == 与equals 的区别 ==是运算符 java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型。byte,short,char,int,long,float,double,boolean ,他们之间的比较,应该用...

CTO搬砖达人 ⋅ 2017/03/10 ⋅ 0

equals和hashCode的区别和联系

一、前言 前段时间使用list.remove(obj)的时候重写了obj的equals方法,因为list的remove是以equals来判断标准的。但是,今天被公司的代码扫描工具提示未重写hashCode方法!!之前准备面试时也...

叫我宫城大人 ⋅ 2017/08/23 ⋅ 0

Java 中正确使用 hashCode 和 equals 方法

在这篇文章中,我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现,以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。 目录: hashCode()和equ...

王振威 ⋅ 2012/10/21 ⋅ 43

Object类中的equals();hashcode();toString()方法

1.equals();对于基本类型数据比较的是数值,对于对象类型的数据则是比较引用,既是两个对象是否指向了同一块存储区域; 2.hashCode();返回一个散列码,是否对象导出的导出的整数值,如果x...

小和尚敲代码 ⋅ 2016/04/04 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JavaScript零基础入门——(八)JavaScript的数组

JavaScript零基础入门——(八)JavaScript的数组 欢迎大家回到我们的JavaScript零基础入门,上一节课我们讲了有关JavaScript正则表达式的相关知识点,便于大家更好的对字符串进行处理。这一...

JandenMa ⋅ 今天 ⋅ 0

sbt网络问题解决方案

转自:http://dblab.xmu.edu.cn/blog/maven-network-problem/ cd ~/.sbt/launchers/0.13.9unzip -q ./sbt-launch.jar 修改 vi sbt/sbt.boot.properties 增加一个oschina库地址: [reposit......

狐狸老侠 ⋅ 今天 ⋅ 0

大数据,必须掌握的10项顶级安全技术

我们看到越来越多的数据泄漏事故、勒索软件和其他类型的网络攻击,这使得安全成为一个热门话题。 去年,企业IT面临的威胁仍然处于非常高的水平,每天都会看到媒体报道大量数据泄漏事故和攻击...

p柯西 ⋅ 今天 ⋅ 0

Linux下安装配置Hadoop2.7.6

前提 安装jdk 下载 wget http://mirrors.hust.edu.cn/apache/hadoop/common/hadoop-2.7.6/hadoop-2.7.6.tar.gz 解压 配置 vim /etc/profile # 配置java环境变量 export JAVA_HOME=/opt/jdk1......

晨猫 ⋅ 今天 ⋅ 0

crontab工具介绍

crontab crontab 是一个用于设置周期性被执行的任务工具。 周期性执行的任务列表称为Cron Table crontab(选项)(参数) -e:编辑该用户的计时器设置; -l:列出该用户的计时器设置; -r:删除该...

Linux学习笔记 ⋅ 今天 ⋅ 0

深入Java多线程——Java内存模型深入(2)

5. final域的内存语义 5.1 final域的重排序规则 1.对于final域,编译器和处理器要遵守两个重排序规则: (1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用...

江左煤郎 ⋅ 今天 ⋅ 0

面试-正向代理和反向代理

面试-正向代理和反向代理 Nginx 是一个高性能的反向代理服务器,但同时也支持正向代理方式的配置。

秋日芒草 ⋅ 今天 ⋅ 0

Spring 依赖注入(DI)

1、Setter方法注入: 通过设置方法注入依赖。这种方法既简单又常用。 类中定义set()方法: public class HelloWorldOutput{ HelloWorld helloWorld; public void setHelloWorld...

霍淇滨 ⋅ 昨天 ⋅ 0

马氏距离与欧氏距离

马氏距离 马氏距离也可以定义为两个服从同一分布并且其协方差矩阵为Σ的随机变量之间的差异程度。 如果协方差矩阵为单位矩阵,那么马氏距离就简化为欧氏距离,如果协方差矩阵为对角阵,则其也...

漫步当下 ⋅ 昨天 ⋅ 0

聊聊spring cloud的RequestRateLimiterGatewayFilter

序 本文主要研究一下spring cloud的RequestRateLimiterGatewayFilter GatewayAutoConfiguration @Configuration@ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMi......

go4it ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部