1、AbstractSet类是一个便利类,它扩展了AbstractCollection类并实现Set接口,AbstractSet类提供equals方法和hashCode方法的具体实现。由于AbstractSet类没有实现size方法和iterator方法,所以,AbstractSet类是一个抽象类。
2、Set接口的三个具体类是:散列类HashSet、链式散列集LinkedHashSet和树形集TreeSet。
一个测试LinkedHashSet的程序
TestLinkedHashSet.java
import java.util.*;
public class TestLinkedHashSet{
public static void main(String[] args){
//Create a hash set
Set set = new Linked HashSet();
//Add strings to the set
set.add("London");
set.add("Paris");
set.add("New York");
set.add("San Francisco");
set.add("Beijing");
set.add("New York");
System.out.println(set);
//Display the elements in the hash set
for(Object element: set)
System.out.println(elements.toString().toLowerCase() + " ");
}
}
结果:
[London, Paris, New York, San Francisco, Beijing]
london paris new york san francisco beijing
提示:LinkedHashSet保持了元素插入的顺序,要强加一个不同的顺序,如升序或降序,可以使用 TreeSet类。
如果不需要维护元素被插入的顺序,就应该使用HashSet,它会比LinkedHashSet更加高效。
3、SortedSet是Set的一个子接口,它可以确保规则集中的元素是有序的,它还提供方法first()和last()以返回规则集中的第一个元素和最后一个元素,以及方法headSet(toElement)和tailSet(fromElement)以返回规则集中元素小于toElement和大于或等于fromElement的那一部分。
4、NavigableSet扩展了SortedSet,并提供导航方法lower(e)、floor(e)、ceiling(e)和higher(e)以分别返回小于、小于或等于、大于或等于以及大于一个给定的元素的元素。如果没有这样的元素,则返回null。方法pollFirst()和polLast()会分别删除和返回树形集中的第一个元素和最后一个元素。
5、TreeSet实现了SortedSet接口的一个具体类。使用Comparable方法对它们进行比较,由于添加到规则集中的对象都是Comparable的实例。这种方法定义的顺序通常称为自然顺序。如果类的元素没有实现Comparable接口,或者在实现Comparable接口的类中不想使用comparableTo方法进行比较,那么可以给规则集汇总的元素指定一个比较器,这种方法定义的顺序称为比较器顺序。
这个例子使用TreeSet类改写,然后按照字母顺序来显示这些字符串。
TestTreeSet.java
import java.util.*;
public class TestTreeSet{
public static void main(String[] args){
//Create a hash set
Set set = new HashSet();
//Add strings to the set
set.add("London");
set.add("Paris");
set.add("New York");
set.add("San Francisco");
set.add("Beijing");
set.add("New York");
TreeSet treeSet = new TreeSet(set);
System.out.println("Sorted tree set: " + treeSet);
//Use the methods in SortedSet interface
System.out.println("first(): " + treeSet.first());
System.out.println("last(): " + treeSet.last());
System.out.println("headSet(): " + treeSet.headSet("New York"));
System.out.println("tailSet(): " + treeSet.tailSet("New York"));
//Use the methods in NavigableSet interface
System.out.println("lower(\"P\"): " + treeSet.lower("P"));
System.out.println("higher(\"P\"): " + treeSet.higher("P"));
System.out.println("floor(\"P\"): " + treeSet.floor("P"));
System.out.println("ceiling(\"P\"): " + treeSet.ceiling("P"));
System.out.println("pollFirst(\"P\"): " + treeSet.pollFirst("P"));
System.out.println("pollLast(\"P\"): " + treeSet.pollLast("P"));
System.out.println("New tree set: " + treeSet);
}
}
结果:
Sorted tree set: [Beijing, London, New York, Paris, San Francisco]
first(): Beijing
last(): San Francisco
headSet(): [Beijing, London]
tailSet(): [New York, Paris, San Francisco]
lower(“P”): New York
higher(“P”): Paris
floor(“P”): New York
ceiling(“P”): Paris
pollFirst(): Beijing
pollLast(): San Francisco
New tree set: [London, New York, Paris]
注意:java集合框架中所有具体类都至少有两个构造方法:一个是创建空集合的无参构造方法,另一个是用某个集合来创建实例的构造方法。这样,TreeSet类中就含有从集合c创建TreeSet对象的构造方法TreeSet(Collection c).如new TreeSet(hashSet)方法从集合hashSet创建了TreeSet的一个实例。
提示:当更新一个规则集时,如果不需要保持元素的排序关系,就应该使用散列集,因为在散列集中插入和删除元素所花的世界比较少。当需要一个排好序的集合时,可以从这个散列集创建一个树形集。