1. 程式人生 > >集合框架(四)如何使用以及何時使用HashSet、LinkedHashSet或者TreeSet來儲存元素

集合框架(四)如何使用以及何時使用HashSet、LinkedHashSet或者TreeSet來儲存元素

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<Stirng> treeSet = new TreeSet<String>(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的一個例項。
提示:當更新一個規則集時,如果不需要保持元素的排序關係,就應該使用雜湊集,因為在雜湊集中插入和刪除元素所花的世界比較少。當需要一個排好序的集合時,可以從這個雜湊集建立一個樹形集。