java集合 HashSet

HashSet中如果要放入一个自己定义的类实例的时候比如Person类实例,这时候我们要自己重hashcode和equal方法,用自己的关键字段来重写,因为当使用HashSet时,hashCode()方法就会得到调用,判断已经存储在集合中的对象的hash code值是否与增加的对象的hash code值一致;如果不一致,直接加进去;如果一致,再进行equals方法的比较,equals方法如果返回true,表示对象已经加进去了,就不会再增加新的对象,否则加进去。

先调用hashCode()方法,-->判断存放的链表位置

再调用equals()方法,-->判断对应链表上有没有相同的元素,有的话就不能再放,

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

public class SetTest1 {
	public static void main(String[] args) 
	{
		Set<Student1> set=new HashSet<Student1>();
		set.add(new Student1("B1000","小明","male",20));
		//[[id=B1000, name=小明, sex=male, age=20]]
		System.out.println("set="+set);
		set.add(new Student1("B1000","小明"));
		//学号相同,认为是同一个学生,Set集合不能放入相同的元素,所有不能再放入
		System.out.println("set="+set);
		//[[id=B1000, name=小明, sex=male, age=20]]
		set.add(new Student1("B1000","小明","male",20));
		System.out.println("set="+set);
		set.add(new Student1("B1001","小明","male",20));
		set.add(new Student1("B1002","小明","male",20));
		System.out.println("set="+set);
		//显示hashSet集合
		Student1.printSet(set);
		
	}
}
/*
class Student1
{
	private String id;
	private String name;
	private String sex;
	private int age;
	public Student1(){}
	public Student1(String id,String name,String sex,int age)
	{
		this.id=id;
		this.name=name;
		this.sex=sex;
		this.age=age;
	}
	public Student1(String id,String name,String sex)
	{
		this.id=id;
		this.name=name;
		this.sex=sex;
	}
	public Student1(String id,String name)
	{
		this.name=name;
		this.id=id;
	}
	@Override
	public String toString() {
		return "[id=" + id + ", name=" + name + ", sex=" + sex + ", age=" + age + "]";
	}
	//如果学号相同,那就认为学生相同
	@Override
	public boolean equals(Object obj)
	{
		Student1 student1=(Student1)obj;
		return this.id.equals(student1.id);
	}
	@Override
	public int hashCode() {
		// TODO Auto-generated method stub
//		return super.hashCode();
		//调用String类型的hashCode()方法
		return this.id.hashCode();
	}
	//遍历方法
	public static void  printSet(Set set)
	{
		System.out.println("{");
		for(Iterator<Student1> iterator=set.iterator();iterator.hasNext();)
		{
			Student1 student1=iterator.next();
			System.out.print(student1+"\n");
		}System.out.print("}");
	}
}*/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值