关闭

[JAVA]Java中hashCode和equals方法的使用

295人阅读 评论(0) 收藏 举报
分类:

hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。 

首先看MyClass这个类,如下。

public class MyClass {
	private int id;
	private String name;
	public MyClass(int id, String name) {
		super();
		this.id = id;
		this.name = name;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}

这个时候写个测试。如下。

package testEquals;

import java.util.HashSet;
import java.util.Set;

public class Main{
	public static void main(String[] args) {
		MyClass mc1 = new MyClass(1, "ma");
		MyClass mc2 = new MyClass(1, "ma");
		Set<MyClass> set=new HashSet<MyClass>();
		System.out.println(mc1.equals(mc2));
		set.add(mc1);
		set.add(mc2);
		System.out.println(set.size());
	}
}

结果分别是false和2。

现在覆写equals方法。

equals方法的正确覆写应该满足 三个性质,反身性,对称性,传递性。这里就不再解释了,数学功底好的同学应该很容易理解这个。

在MyClass类中,加入如下方法。

        @Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		MyClass other = (MyClass) obj;
		return other.getId()==getId() && other.getName().equals(getName());
	}

此时继续运行上面的测试,显示结果为:true,2。

为什么是2呢?这2个明明的相等的。原来,是没有覆写hashCode的原因。关于HashSet这里就不再描述了。

        @Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + id;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

覆写hashCode(通过Eclipse IDE 生成的)后,显示 true,1。

所有覆写equals方法的时候都应该覆写hashCode方法,否则所有该类基于散列的集合的操作都无法正常完成(上面我们测试了HashSet,HashMap,HashTable也是一样的)

但是注意,此时若通过“==”比较,还是false的。因为“==”方法比较的是对象的地址。所以才是false。

0
0
查看评论

Java-正确使用equals和hashCode方法

基本摘抄自Java 中正确使用 hashCode 和 equals 方法 hashCode()和equals()定义在Object类中,这个类是所有java类的基类,所以所有的java类都继承这两个方法。1.equalsequals要遵守的通用约定(equals方法实现了等价关系): 1)自反性...
  • qing0706
  • qing0706
  • 2016-01-27 14:09
  • 1872

Java中的equals和hashCode方法详解

Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法,今天就来介绍一些这两个方法的作用。 equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类...
  • jiangwei0910410003
  • jiangwei0910410003
  • 2014-04-01 16:15
  • 54091

JAVA中equals方法与hashCode方法学习

1,equals方法的比较与 == 的区别是什么?为什么需要重写equals方法? 2,为什么说重写了equals方法最好重写hashCode方法?该问题在参考博文里面有一个实例解释了原因。 3,如何重写equals方法和hashCode方法? ————————————————————...
  • q1054261752
  • q1054261752
  • 2015-09-25 18:22
  • 342

Java 覆盖equals和hashCode方法

覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重,最容易避免这类问题的办法就是不覆盖equals方法。 什么时候需要覆盖equals方法?如果类具有自己特有的“逻辑相等”概念(不同于对象等同),而且超类还没有覆盖equals方法以实现期望的行为,这时需要覆盖eq...
  • RickyIT
  • RickyIT
  • 2017-02-17 11:30
  • 529

HashMap中的equals和hashCode

Java的Object对象有9个方法,其中的equals()和hashCode()在hashMap的实现里面起着比较重要的作用,我在研究hashMap的源码时就遇到了它们俩,此篇博文主要是为了记录它们之间的相爱相杀。为了说明它们的关系,我们需要HashMap的背景知识。HashMap的存储方式Has...
  • qiuych3
  • qiuych3
  • 2016-05-06 21:26
  • 1492

java Object对象中hashCode和equals方法学习

学习了多年的java的人对hashCode和equals方法都不是很清楚。 总的来说,Java中的集合(Collection)有两类,一类是List,另一类是Set。前者集合内的元素是有序的,元素可以重复;后者元素无序,但元素不可重复。那么这里就有一个比较严重的问题了:如何判断两个对象相等呢?这就是...
  • lan12334321234
  • lan12334321234
  • 2017-04-11 10:45
  • 425

java中hashcode与equals详解(集合中的用法)

一:Java中的equals方法和hashCode方法是Object中的,所以每个对象都是有这两个方法的,有时候我们需要实现特定需求,可能要重写这两个方法 equals()和hashCode()方法是用来在同一类中做比较用的,尤其是在容器里如set存放同一类对象时用来判断放入的对象是否重复。 ...
  • happyAliceYu
  • happyAliceYu
  • 2016-08-24 11:21
  • 933

如何正确的重写equals() 和 hashCode()方法

equals和hashCode重写技巧
  • zzg1229059735
  • zzg1229059735
  • 2016-05-25 15:36
  • 7366

java覆盖equals()方法时总要覆盖hashCode()

我们再用JAVA创建自己的类的时候,一种比较常见的覆盖就是覆盖Object中的equals()方法和hashCode()方法。如果不这样做的话,就很可能违反Object.hashCode()的通用约定,从而在利用自己建的类构建需要Hash化的集合的正常工作。其中有一条约定很重要: 如果两个对象利用...
  • Tredemere
  • Tredemere
  • 2016-03-05 10:08
  • 2694

java.lang.Object 对象中 hashCode 和 equals 方法详解及其延伸

什么是hashcode hashcode在Java中的相关引用 equals方法 hashcode于equals两者关系比较
  • qq_21163061
  • qq_21163061
  • 2017-06-22 16:21
  • 364
    个人资料
    • 访问:161803次
    • 积分:2524
    • 等级:
    • 排名:第17169名
    • 原创:91篇
    • 转载:0篇
    • 译文:9篇
    • 评论:34条