HashSet

来源:互联网 发布:爱因斯坦 以色列 知乎 编辑:程序博客网 时间:2024/06/06 09:38

HashSet

  1. 实现Set接口的hash table(哈希表),依靠HashMap来实现的;(file 1)
  2. 我们应为要存放到散列表的各个对象定义hashCode()和equals();(file 2)
  3. 散列表
    1. 散列表又称为哈希表。散列表算法的基本思想是:以结点的关键字为自变量,通过一定的函数关系(散列函数)计算出对应的函数值,以这个值作为该结点存储在散列表中的地址;
    2. 当散列表中的元素存放太满,就必须进行再散列,将产生一个新的散列表,所有元素存放在新的散列表中,原先的散列表将被删除。在Java语言中,通过负载因子(load factor)来决定何时对散列表进行再散列。例如:如果负载因子是0.75,当散列表中已经有75%的位置已经放满,那么将进行再散列;
    3. 负载因子越高(越接近1.0),内存的使用效率越高,元素的寻找时间约长。负载因子越低(越接近0.0),元素的寻找时间越短,内存浪费越多;
    4. 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());// two one three            // 可以看出hash不固定顺序,不允许重复        }    }}## 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;    }    // 如果不重写hashCode、equals,对象就不会去重;    public int hashCode(){        return num * name.hashCode();    }       public boolean equals(Object o){        Students s = (Students)o;               return num == s.num && name.equals(s.name);    }}
0 0
原创粉丝点击