接上篇:java集合类(三)About Iterator & Vector(Stack)
之前,在比较java常见集合类的时候,就了解到一点有关Set的特性、实现类及其要求等,读者可以去温习下“java集合类(一)”。Set与Collection接口完全一样('cause 它继承了Collection接口---接口间继承,可以此拓展接口功能,另外,java只能通过接口实现多继承,而抽象类则不行),只是与Collection的行为不一样(多态性表现)。Set保存的是不重复元素,但不保证元素次序,它常被用来测试归属性,即通过对象的值,判断元素是否在某个Set集合内,通常使用HashSet实现,因为HashSet专门对快速查找进行了优化(hashCode()实现)。另外2种常见的Set,TreeSet则实现Comparable接口,以一定的方式对元素进行排序,并用红黑树存储这些元素;LinkedHashSet也使用了hashCode(),但它使用链表来维护元素顺序---即元素的插入顺序。这三者的比较可见下文!下面介绍Set的使用:
- Talk about “Set”:
- All Superinterfaces:Collection<E>, Iterable<E>
- All Known Subinterfaces:NavigableSet<E>, SortedSet<E>
- All Known Implementing Classes:AbstractSet, ConcurrentSkipListSet, CopyOnWriteArraySet, EnumSet, HashSet, JobStateReasons, LinkedHashSet, TreeSet
- 1.Set 的常规使用:
//demo from <Thinking in java> import java.util.*; public void setdemo(){ Random r = new Random(30); Set<Integer> set = new HashSet<Integer>(); for(int i = 0; i<10000; i++) set.add(r.nextInt(20)); System.out.println(set); } /*output: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 17, 16, 19, 18] */
上面实例只对add()进行,因为Set跟之前的Collection差不多,其他方法便不再一一演示。在上面代码中使用了Random进行对Set元素的添加,这里就顺便用Set实现“在特定范围内,确保每次产生不同的随机数”
//Random 5 different nums between 10~100 every time import java.util.*; public void randomdemo(){ HashSet<Integer> hs = new HashSet<Integer>(); while (true) { int a = (int)(Math.random() * 100); if(a >= 10 && a <= 100) { hs.add(a); } if (hs.size() == 5) { break; } } System.out.println(hs); } //output:[23, 97, 82, 41, 30]
- 关于使用Set测试元素的归属性,主要采用的是contains()及其相关方法,用法跟其他前面提及的java集合类差不多,这里也不作实例演示。
- 三种常用Set实现类的比较:
1)HashSet: 为快速查找而设计的set,存入HashSet的元素必须定义hashCode(),编程中一般使用这种(对元素顺序无要求时)
2)TreeSet: 保持次序的Set,底层结构为红黑树,使用它可以从Set中提取有序序列,存入其中的元素必须实现Comparable接口
3)LinkedHashSet:具有HashSet的查询速度,使用链表维护元素的顺序(即插入顺序),元素必须定义hashCode()
注:关于hashCode(),以后有时间再跟读者详细讨论,现在只需知道:在这里,它是为快速查找而必须实现的方法!
2.About SortedSet:
- All Superinterfaces:Collection<E>, Iterable<E>, Set<E>
- All Known Subinterfaces:NavigableSet<E>
- All Known Implementing Classes:ConcurrentSkipListSet, TreeSet
- 有关SortedSet的方法:
1)Comparator comparator():Returns the comparator used to order the elements in this set, or null if this set uses the natural ordering of its elements
2)Object first():Returns the first (lowest) element currently in this set
3)Object last():Returns the last (highest) element currently in this set
4)SortedSet subSet(fromelement,toelement):
Returns a view of the portion of this set whose elements range from fromElement, inclusive, to toElement, exclusive
5)SortedSet headSet(toelement):Returns a view of the portion of this set whose elements are strictly less than toElement
6)SortedSet tailSet(fromelement):Returns a view of the portion of this set whose elements are greater than or equal to fromElement
- SortedSet的示例:
import java.util.*; public void sortedsetdemo(){ SortedSet<String> sortedset = new TreeSet<String>(); Collections.addAll(sortedset, "1 2 3 4 5".split(" ")); System.out.println(sortedset); System.out.println(sortedset.first()); System.out.println(sortedset.last()); System.out.println(sortedset.subSet("1","4")); System.out.println(sortedset.headSet("3")); System.out.println(sortedset.tailSet("2")); }
输出:
[1, 2, 3, 4, 5]
1
5
[1, 2, 3]
[1, 2]
[2, 3, 4, 5]
下一节学习“java集合类(五)About Map”!
### 学习从来都是一个过程,对对错错对对...若文中有错误,还望读者批评指出 ###