JAVA集合框架

JAVA集合框架

JAVA集合類庫與現代大多數數據結構類庫一樣,也將接口與實現分離,利用這種方式,一旦改變了想法,可以輕鬆地使用另一種不同的方法實現;




Collection接口和Iterator迭代器接口

集合類的基本接口是Collection,這個接口有兩個基本方法:

public interface Collection<E>
{
    boolean add(E element);//用於添加元素,如果集合沒有返回false,反之返回true
    Iterator<E> iterator();//返回Iterator接口對象
}  

迭代器接口有三個方法

public interface Iterator<E>
{
    E next();//可以逐個返回集合中的元素
    boolean hasNext(); //如果迭代器對象還有多個供訪問的元素,返回true
    void remove();
}

可以使用如下方法訪問集合中的每個元素

Collection<String> c = ... ; //使用接口類型存放集合的引用,便於更改實現;
Iterator<String> iter = c.iterator();
//for each循環可以與任何實現了Iterator接口的對象一起工作
//而Collection擴展了Iterator接口
//注:如果訪問的是HasSet中的元素,每個元素將會按隨機次序出現
for(Sring Element : c)
{
    //do something
}

注:1.查找一個元素的唯一方法是調用next方法,Java迭代器可以認爲是位於兩個元素之間,當調用next方法時,迭代器會越過下一個元素,並返回剛纔越過的那個元素的引用;2.決定刪除某個元素時需要判斷這個元素是否有意義,所以使用remove刪除某個元素時,需要調用next越過這個元素;

List接口

List接口用於描述一個有序的集合,可以使用兩種訪問元素的協議:一種是使用迭代器;一種是使用get和set方法隨機訪問每個元素。後者不適用於鏈表,但對數組很有用,實現List接口的常用類有LinkedList,ArrayList,Vector和Stack。ArrayList,Vector都是動態數組實現的,建議在不需要同步時使用ArrayList,而不使用Vector,LinkedList是使用鏈表實現的。 List還提供一個listIterator()方法,返回一個 ListIterator接口,和標準的Iterator接口相比,ListIterator多了一些add()之類的方法,允許添加,刪除,設定元素,還能向前或向後遍歷。

LinkedList

鏈表是一個有序集合,每個對象的位置十分重要。使用add方法將會將對象添加到尾部。List還提供一個listIterator()方法,返回一個 ListIterator接口。該接口中包含add方法,但是返回爲空,它假定添加元素後會改變鏈表的結構。

interface ListIterator<E> extends Iterator<E>
{
    void add(E element);
    E previous(); //返回越過的對象
    boolean hasPrevious();

}

如果一個迭代器發現它的集合被另一個迭代器修改了,或者被該集合自身的方法修改了,就會拋出一個Concurrent ModificationException異常,建議不要使用get方法訪問LinkedList中的元素,這個方法的效率並不高。

Set接口

Set接口是一種不包含重複的元素的Collection,它是通過散列表實現的,實現Set的常用類有HashSet和TreeSet。由於散列將元素散列在表的各個位置上,所以訪問他們的順序幾乎是隨機的,只有不關心集合中元素的順序時才使用HashSet。

TreeSet

樹集是一個有序集合,可以按任意順序將元素插入到集合中,當遍歷時,每個值將按排序後的順序出現,樹集是通過紅黑樹實現的,添加元素時,都被放置在正確的排序位置上。因此,插入一個元素要比HashSet慢。 樹集通過實現Comparable接口來比較兩個元素的順序。

public interface Comparable<T>
{
    //a.compareTo(b),a在b前返回負值;
    int compareTo(T other);
}

map

映射表,使用一個鍵值對來存儲元素,如果提供了鍵值就能夠查找到該值。Java類庫爲映射表提供了兩個通用的實現HashMap和TreeMap。 散列映射表對鍵進行散列,樹映射表用鍵的整體順序對元素進行排序。鍵值必須是唯一的,不能對同一個鍵存放兩個值。 映射表有三個視圖,他們是一組實現了Collection接口的對象,或者它子接口視圖。分別爲:鍵集,值集合和鍵值對集。

Set<k> keySet() //實現了Set接口的某個其他類對象
Collection<K> values()
Set<Map.Entry<K, V>> entrySet()

如果要同時查看鍵值,就可以通過枚舉各個條目查看,以避免對值進行查找。

for(Map.Entry<String, Employee> entry : staff.entrySet())
{
    String key = entry.getKey();
    Employee value = entry.getValue();
    \\to do
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章