HashSet
- 实现Set接口的hash table(哈希表),依靠HashMap来实现的;(file 1)
- 我们应为要存放到散列表的各个对象定义hashCode()和equals();(file 2)
- 散列表
- 散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址;
- 当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放在新的散列表中,原先的散列表将被删除。在Java语言中,通过负载因子(load factor)来决定何时对散列表进行再散列。例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行再散列;
- 负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间约长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多;
- HashSet类的缺省负载因子是0.75;
## file 1 ##
import java.util.*;
class HashSetTest{
public static void main(String[] args){
HashSet hs = new HashSet();
hs.add("one");
hs.add("two");
hs.add("three");
hs.add("one");
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
## file 2 ##
import java.util.*;
class HashSetTest{
public static void main(String[] args){
HashSet hs = new HashSet();
hs.add(new Students(12,"zhangsan"));
hs.add(new Students(14,"lisi"));
hs.add(new Students(11,"wangwu"));
hs.add(new Students(12,"zhangsan"));
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
class Students{
int num;
String name;
Students(int num,String name){
this.num = num;
this.name = name;
}
public String toString(){
return "num="+num+";"+"name="+name;
}
public int hashCode(){
return num * name.hashCode();
}
public boolean equals(Object o){
Students s = (Students)o;
return num == s.num && name.equals(s.name);
}
}