集合框架(四)如何使用以及何时使用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 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的一个实例。
提示:当更新一个规则集时,如果不需要保持元素的排序关系,就应该使用散列集,因为在散列集中插入和删除元素所花的世界比较少。当需要一个排好序的集合时,可以从这个散列集创建一个树形集。

你可能感兴趣的:(java集合框架,set,LinkedHash,hashset)