HashSet

Set:元素是无序的(存入和取出的顺序不一定一致),元素不可重复。

HashSet:底层的数据结构是哈希表,线程不安全且不同步。

HashSet通过hashCode和equals来保证元素的唯一性。

1.如果元素的hashCode值相同,那么会判断equals,从而判断元素是否相同;

2.如果hashCode值不相同,则元素不同,不再判断equals。


下面贴下一段代码解释:

自定义hashCode,通过姓名和年龄不同判断不同的人。

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

public class HashSetDemo {

	public static void main(String[] args) {
		HashSet<Person> hs=new HashSet<Person>();
		hs.add(new Person("张三",20));
		hs.add(new Person("张三",21));//add添加是Object类型
		hs.add(new Person("张三",20));
		hs.add(new Person("李四",20));
		Iterator<Person> it=hs.iterator();
		while(it.hasNext())
		{
			Person p=(Person)it.next();
			System.out.println(p.getName());
			System.out.println(p.getAge());
			System.out.println(p.hashCode());//注意这里的hashCode的输出
		}
	}

}
public class Person {
	private String name;
	private int age;
	Person(String n,int a)
	{
		this.name=n;
		this.age=a;
	}
	
	public String getName()
	{
		return this.name;
	}
	
	public int getAge()
	{
		return this.age;
	}
	public int hashCode()//默认是以地址来判断
	{
		System.out.println(name.hashCode());
		return name.hashCode()+age*37;//自定义,通过名字和年龄判断。如果不是自定义,默认new的每个对象都是不同hashCode的。
	}
	public boolean equals(Object o)
	{
		if(o instanceof Person)
		{
			Person oo=(Person)o;
	//		System.out.println(oo.getname());
			return this.name.equals(oo.getName())&&this.age==oo.age;
		}
		else
			return false;
	}
}
输出结果:

775629
775666
775629
842801
张三
20
775629
775629
张三
21
775666
775666
李四
20
842801
842801


我们从结果知道,(姓名,年龄)的hashCode不相同时,就直接知道是不同元素,而(“张三”,20)hashCode相同时,则需判断equals方法是true表示是相同,所以添加的两个(“张三”,20)是相同的,只记录一个。

注意:如果不是自定义,则new的每个对象的hashCode都是不同的。

ps:有误欢迎指出来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值