重写Java Object对象的hashCode和equals方法实现集合元素按内容判重

Java API提供的集合框架中Set接口下的集合对象默认是不能存储重复对象的,这里的重复判定是按照对象实例句柄的地址来判定的,地址相同则判定为重复,地址不同不管内容如何都判定为不重复,这有时与需求不符,可以通过重写hashCode和equals方法实现按照集合元素的任意内容判定重复。

public class Employee implements Cloneable
{
	private int id;
	private String name;

	public Employee(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;
	}

	@Override
	public int hashCode()
	{
		return this.getId();
	}

	@Override
	public boolean equals(Object obj)
	{
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;

		Employee other = (Employee) obj;
		if (id != other.id)
			return false;

		return true;
	}

	@Override
	protected Employee clone() throws CloneNotSupportedException
	{
		return (Employee) super.clone();
	}

}

 

public class Test
{

	public static void main(String[] args) throws CloneNotSupportedException
	{
		Set<Employee> set = createEmployeeSet();
		System.err.println(set.size());
		for (Employee e : set)
		{
			System.out.println(e.getId() + "  " + e.getName());
		}
	}

	public static Set<Employee> createEmployeeSet()
			throws CloneNotSupportedException
	{
		Set<Employee> set = new HashSet<Employee>();

		Employee e1 = new Employee(1, "xmc1");
		Employee e2 = new Employee(2, "xmc2");
		Employee e3 = e1.clone();
		Employee e4 = new Employee(2, "xmc3");
		set.add(e1);
		set.add(e2);
		set.add(e3);
		set.add(e4);

		return set;

	}

}



 

posted @ 2014-07-25 09:49  xmc0551  阅读(404)  评论(0编辑  收藏  举报