集合框架比较两个对象是否相同(equals和hashCode方法)

Posted 静! 非淡泊无以明志,非宁静无以致远!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了集合框架比较两个对象是否相同(equals和hashCode方法)相关的知识,希望对你有一定的参考价值。

package com.dcz.hashset;

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

/**
 * HashSet是接口最常用的实现类,顾名思义,底层采用了哈希表算法。
 * 
 * 在HashSet中如何判断两个对象是否是否相等问题分析:
 * 1. 要用两个对象的equals方法比较,返回true说明对象相同。
 * 2. 两个对象的hashCode方法返回值相同。
 * 
 * 对象hashCode决定了在哈希表中的存储位置。
 * 
 * 向HashSet集合中添加新对象时候,先会判断该对象和集合对象中的hashCode值:
 * 1. 不等:直接把该对象存储到hashCode的指定位置。
 * 2. 相等:再继续判断新对象和集合对象中的equals做比较。
 * 	2.1. equals方法true,则视为是同一个对象,则不保存在哈希表中。
 *  2.2. equals方法false,存储在之前对象同槽位的链表上(拒绝)。
 *  
 * 对象的HashCode和equals方法的重要性。
 * 
 * 存储在哈希表中的对象,都应该覆盖equals方法和hashCode方法,并且保证equals相等的时候hashCode值也相等。
 * 
 * *****************************************************************
 * 结论:如果需要把我们自定义的对象存储到哈希表中,该类型的对象必须覆盖equals和hashCode方法,
 *     并在该方法中提供自己的判断规则,可以使用eclipse工具自动生成hashCode和equals方法。
 * *****************************************************************
 */

class A{

	@Override
	public boolean equals(Object obj) {
		return true;
	}
}

class B{

	@Override
	public int hashCode() {
		return 1;
	}
}

class C{

	@Override
	public int hashCode() {
		return 2;
	}

	@Override
	public boolean equals(Object obj) {
		return true;
	}
}

class Student{
	private int sn;
	private String name;
	private int age;
	public Student(int sn, String name, int age) {
		super();
		this.sn = sn;
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Student [sn=" + sn + ", name=" + name + ", age=" + age + "]";
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		result = prime * result + sn;
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Student other = (Student) obj;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		if (sn != other.sn)
			return false;
		return true;
	}
	
}

public class Hash {
	
	public static void main(String[] args) {
//		Set setInt = new HashSet();
//		setInt.add(new A());
//		setInt.add(new A());
//		setInt.add(new B());
//		setInt.add(new B());
//		setInt.add(new C());
//		setInt.add(new C());
//		System.out.println(setInt);
		
		
		Set<Student> set = new HashSet<Student>();
		
		set.add(new Student(1, "赵一", 17));
		set.add(new Student(2, "赵一", 17));
		set.add(new Student(1, "张三", 18));
		set.add(new Student(1, "张三", 18));
		
		System.out.println(set.size());
		System.out.println(set);
		
	}

}

  

以上是关于集合框架比较两个对象是否相同(equals和hashCode方法)的主要内容,如果未能解决你的问题,请参考以下文章

集合框架

Java中equals和hashcode的区别?

equals和==的区别

intellij idea中怎么覆盖tostring(),hashcode(),equals()?

java中的equals和==

java中equals和equalsignorecase的区别