HashSet底层实现是hashtable。
HashSet判断重复的条件是hashCode()+equals方法
每个元素插入前,首先会调用自己的hashCode(),判断与其它Set中的hashCode是否一致,hashCode不一致,那么不一样,可以插入。如果一样,再调用自己的equals方法,判断看与Set中的其它元素,是否一样,如果不一样,那么能插入。
如果要在Set中插入自定义对象,那么要重写hashCode和equals方法。
示例代码:
package test;
import java.util.HashSet;
import java.util.Iterator;
public class TestHashSet {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Person("java01",1));
hs.add(new Person("java02",2));
hs.add(new Person("java03",3));
hs.add(new Person("java01",1));
for(Iterator it = hs.iterator(); it.hasNext();){
System.out.println(it.next());
}
}
}
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int hashCode() {
return this.name.hashCode()+this.age*11;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Person))
return false;
else{
Person p = (Person)obj;
return this.name.equals(p.name)&&this.age==p.age;
}
}
}