`
cloudeagle_bupt
  • 浏览: 538961 次
文章分类
社区版块
存档分类
最新评论

HashSet和TreeSet

 
阅读更多

转自:http://www.cnblogs.com/beyondwcm/archive/2007/11/08/953440.html


1|——SortedSet接口——TreeSet实现类
2Set接口——|——HashSet实现类
3|——LinkedHashSet实现类
4HashSet
5此类实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证集合的迭代顺序;特别是它不保证该顺序恒久不变。此类允许使用null元素。
6此类为基本操作提供了稳定性能,这些基本操作包括add、remove、contains和size,假定哈希函数将这些元素正确地分布在桶中。对此集合进行迭代所需的时间与HashSet实例的大小(元素的数量)和底层HashMap实例(桶的数量)的“容量”的和成比例。因此,如果迭代性能很重要,则不要将初始容量设置得太高(或将加载因子设置得太低)。
7
8我们应该为要存放到散列表的各个对象定义hashCode()和equals();
9importjava.util.HashSet;
10importjava.util.Iterator;
11publicclassHashSetTest{
12publicstaticvoidmain(String[]args)
13{
14HashSeths=newHashSet();
15/*hs.add("one");
16hs.add("two");
17hs.add("three");
18hs.add("four");*/

19hs.add(newStudent(1,"zhangsan"));
20hs.add(newStudent(2,"lishi"));
21hs.add(newStudent(3,"wangwu"));
22hs.add(newStudent(1,"zhangsan"));
23
24Iteratorit=hs.iterator();
25while(it.hasNext())
26{
27System.out.println(it.next());
28}

29}

30}

31classStudent//HashSet要重写hashCode和equals方法
32{
33intnum;
34Stringname;
35Student(intnum,Stringname)
36{
37this.num=num;
38this.name=name;
39}

40publicStringtoString()
41{
42return"num:"+num+"name:"+name;
43}

44publicinthashCode()
45{
46returnnum*name.hashCode();
47}

48publicbooleanequals(Objecto)
49{
50Students=(Student)o;
51returnnum==s.num&&name.equals(s.name);
52}

53}

54
55TreeSet
56此类实现Set接口,该接口由TreeMap实例支持。此类保证排序后的set按照升序排列元素,根据使用的构造方法不同,可能会按照元素的自然顺序进行排序,或按照在创建set时所提供的比较器进行排序。
57是一个有序集合,元素中安升序排序,缺省是按照自然顺序进行排序,意味着TreeSet中元素要实现Comparable接口;
58我们可以构造TreeSet对象时,传递实现了Comparator接口的比较器对象.
59importjava.util.*;
60publicclassTreeSetTest{
61publicstaticvoidmain(String[]args)
62{
63//TreeSetts=newTreeSet();
64TreeSetts=newTreeSet(newStudents.compareToStudent());
65ts.add(newStudents(2,"zhangshan"));
66ts.add(newStudents(3,"lishi"));
67ts.add(newStudents(1,"wangwu"));
68ts.add(newStudents(4,"maliu"));
69
70Iteratorit=ts.iterator();
71while(it.hasNext())
72{
73System.out.println(it.next());
74}

75}

76}

77classStudentsimplementsComparable
78{
79intnum;
80Stringname;
81Students(intnum,Stringname)
82{
83this.num=num;
84this.name=name;
85}

86staticclasscompareToStudentimplementsComparator//定义一个内部类来实现比较器
87{
88publicintcompare(Objecto1,Objecto2){
89Studentss1=(Students)o1;
90Studentss2=(Students)o2;
91intrulst=s1.num>s2.num?1:(s1.num==s2.num?0:-1);
92if(rulst==0)
93{
94rulst=s1.name.compareTo(s2.name);
95}

96returnrulst;
97}

98}

99publicintcompareTo(Objecto)//写具体的比较方法
100{
101intresult;
102Studentss=(Students)o;
103result=num>s.num?1:(num==s.num?0:-1);
104if(result==0)
105{
106result=name.compareTo(s.name);
107}

108returnresult;
109}

110publicStringtoString()
111{
112returnnum+":"+name;
113}

114}

115总结
116HashSet是基于Hash算法实现的,其性能通常优于TreeSet,我们通常都应该使用HashSet,在我们需要排序的功能时,我门才使用TreeSet

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics