文档章节

重写equals和hashCode方法的示例

囚徒困境
 囚徒困境
发布于 2015/03/01 23:24
字数 357
阅读 204
收藏 11

如果一个类有自己特有的“逻辑相等”,且需要以此进行比较时,那么就需要重写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;
	}


© 著作权归作者所有

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

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

idoz
2011/12/10
0
0
Java equals()和hashCode()

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

JackieYeah
2014/03/27
0
0
重写equals和hashCode

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

kukudeku
2016/08/24
133
0
hashcode和equals

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

WJobs
06/15
0
0
Java拾遗:001 - 重写 equals 和 hashCode 方法

重写equals方法 在Java中Object类是一个具体类,但它设计的主要目的是为了扩展,所以它的所有非final方法,都被设计成可覆盖(override)的。但任何一个子类在覆盖这些方法时都应遵守一些通用...

一别丶经年
08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Alibaba Java诊断利器Arthas实践--使用redefine排查应用奇怪的日志来源

背景 随着应用越来越复杂,依赖越来越多,日志系统越来越混乱,有时会出现一些奇怪的日志,比如: [] [] [] No credential found 那么怎样排查这些奇怪的日志从哪里打印出来的呢?因为搞不清...

hengyunabc
今天
1
0
home hosts

home hosts lwk@qwfys:~$ cat /etc/hosts127.0.0.1 localhost127.0.1.1 qwfys192.168.56.101vm600.qwfys.com39.108.212.91alpha1.ppy.com39.108.117.122alpha2.p......

qwfys
今天
1
0
大数据教程(6.1)hadoop生态圈介绍及就业前景

1. HADOOP背景介绍 1.1、什么是HADOOP 1.HADOOP是apache旗下的一套开源软件平台 2.HADOOP提供的功能:利用服务器集群,根据用户的自定义业务逻辑,对海量数据进行分布式处理 3.HADOOP的核心组...

em_aaron
今天
4
0
hadoop垃圾回收站

在生产生,hdfs回收站必须是开启的,一般设置为7天。 fs.trash.interval 为垃圾回收站保留时间,如果为0则禁用回收站功能。 fs.trash.checkpoint.interval 回收站检查点时间,一般设置为小于...

hnairdb
昨天
3
0
腾讯与Github的魔幻会面背后的故事…

10月22日,腾讯开源管理办公室有幸邀请到Github新晋CEO Nat Friedman,前来鹅厂参观交流。目前腾讯已经有近70个项目在Github上开源,共获得17w stars,世界排名11位。Github是腾讯开源的主阵...

腾讯开源
昨天
19
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部