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:有误欢迎指出来。