HashSet集合存储自定义对象及注意事项

HashSet集合存储自定义对象及注意事项

HashSet集合属于Set集合,不允许有重复元素;

如果想存储自定义对象,需要覆盖hashCode与equals方法,因为HashSet集合中元素的唯一性保证是靠:

1、先比较元素的hashCode,如果一样

2、再通过方法equals比较元素是否相等

若不等,则存入到HashSet当中。

所以如果你存储自定义对象,一定要覆盖此二方法。

而且,如果你删除元素或插元素,比较规则也是如上规则。才能保证插入元素与删除元素成功!

具体请看如下示例:

 

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

public class HashSetSummarize {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		operateObject();
	}
	
	public static void operateObject()
	{
		Prisoner prisoner1 = new Prisoner("xiashengbing", 32, 13.7);
		Prisoner prisoner2 = new Prisoner("lifenghong", 35, 3.5);
		Prisoner prisoner3 = new Prisoner("yangwei", 29, 10.2);
		Prisoner prisoner4 = new Prisoner("dongyuxing", 21, 1);
		Prisoner prisoner5 = new Prisoner("qingshan", 38, 6.5);
		Prisoner prisoner6 = new Prisoner("lifenghong", 35, 3.5);
		HashSet<Prisoner> hashSet = new HashSet<Prisoner>();
		
		hashSet.add(prisoner1);
		hashSet.add(prisoner2);
		hashSet.add(prisoner3);
		hashSet.add(prisoner4);
		hashSet.add(prisoner5);
		hashSet.add(prisoner6);
		
		printHashSet(hashSet);

		
		
	}

	public static void printHashSet(HashSet<Prisoner> hashSet)
	{
		for (Iterator<Prisoner> iterator = hashSet.iterator(); iterator.hasNext();) {
			Prisoner prisoner = iterator.next();
			System.out.println(prisoner);
		}
	}
}


重点看如下片段:

 

import cn.itcast.list.Person;

public class Prisoner extends Person
{
	private double sentenceDate;

	public Prisoner(String name, int age, double sentenceDate) {
		// TODO Auto-generated constructor stub
		super(name, age);
		this.setSentenceDate(sentenceDate);
	}
	
	public int hashCode()
	{
		int hashCode = this.getName().hashCode() + this.getAge() * 31;
		return hashCode;
	}
	
	public boolean equals(Object object)
	{
		Prisoner prisoner = null;
		if(object instanceof Prisoner)
		{
			prisoner = (Prisoner)object;
		}
		
		return (this.getName().equals(prisoner.getName()) && this.getAge() == prisoner.getAge() && 
				this.getSentenceDate() == this.getSentenceDate());
	}

	public void setSentenceDate(double sentenceDate) {
		this.sentenceDate = sentenceDate;
	}

	public double getSentenceDate() {
		return sentenceDate;
	}
	
	public String toString(){
		return this.getName()+"::"+this.getAge()+"::"+ this.sentenceDate;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值