Java 重写hashCode 方法和equals方法

package Container;

import java.util.HashSet;
import java.util.Iterator;

/*
 
Set 元素是无序的(存入和取出的顺序不一定一致),元素不可以重复
 |---HashSet:底层数据结构是哈希表
 |           HashSet是如何保证元素唯一性呢?
 |			  是通过两个方法来完成的 hashCode 和 equals来完成的
 |			  如果元素的hashCode值相同,才会判断 equals 是否为true
 |           如果hashCode值不相同,不会调用 equals
 |           
 |			 注意:对于判断元素是否存在,以及删除等操作,依赖的方法是元素的
 |			hashCode和equals方法
 |			(arrayList判断元素是否存在只依赖于equals方法)
 |---TreeSet:
Set 集合的功能和 Collection 是一致的

*/

class Person
{
	private String name;
	private int age;
	Person(String name,int age)
	{
		this.name = name;
		this.age = age;
	}
	
	public String getname()
	{
		return name;
	}
	
	public int getage()
	{
		return age;
	}
	
	// 重写 hashCode 方法
	public int hashCode()
	{
		// return 1; 这种方法也能得到效果但会调用 equals 方法,并且 比较次数比较多
		
		// 该种方法调用 String 的hashCode 方法,就不会调用 equals 方法,比较次数少
		return name.hashCode()+age*39; // 保证 hashCode 值的唯一性
	}
	
	public boolean equals(Object obj)
	{
		if (!(obj instanceof Person))
		    return false;
		
		Person person = (Person)obj;
		return this.name.equals(person.name) && this.age == person.age;
	}
}

public class HashSetDemoTwo
{
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
	
	public static void main(String[] args)
	{
		HashSet<Person> hs = new HashSet<Person>();
		
		hs.add(new Person("a1", 11));
		hs.add(new Person("a2", 12));
		hs.add(new Person("a3", 13));
		hs.add(new Person("a4", 14));
		hs.add(new Person("a5", 15));
		hs.add(new Person("a3", 13));
		
		System.out.println( hs.contains(new Person("a1", 11)));
		
		// 判断 a1 是否存在于集合中
		sop("al:"+hs.contains(new Person("a1", 11)));
		
		// 将 a3 移除集合中
		hs.remove(new Person("a3", 13));
		
		// 遍历集合
		Iterator<Person> it = hs.iterator();
		while (it.hasNext())
		{
			Person person = (Person) it.next();
			sop(person.getname()+"==="+person.getage());
		}
	}
}

  

posted @ 2015-07-17 10:03  JiangXiaoKun  阅读(415)  评论(0编辑  收藏  举报