首頁 >Java >java教程 >Java集合之Collection具體詳解

Java集合之Collection具體詳解

黄舟
黄舟原創
2017-03-13 17:28:292222瀏覽



#Java集合是java提供的工具包,包含了常用的資料結構:集合、鍊錶、佇列、堆疊、陣列、映射等。 Java集合工具包位置是java.util.*

Java集合主要可以分割為4個部分:List列表、Set集合、Map映射、工具類別(Iterator迭代器、Enumeration枚舉類別、Arrays和Collections)。

Java集合架構如下圖:

 


#由上圖可以看到Java框架主要是Collection和Map。

一、Collection是一個介面,是一個高度抽象的集合,介麵包含了基本運算和屬性

        Collection包含了List與Set兩大分支:

1)、List是一個有順序的佇列,每個元素都有它的索引# ,第一個元素的索引值是0。 List的實作類別有LinkedList、ArrayList、Vector和Stack。

         (1)、LinkedList實作了List接口,允許元素為空,LinkedList提供了額外的get,remove,insert方法,這些操作可以使LinkedList被用作堆疊、佇列或雙向佇列。

           LinkedList並不是執行緒安全的,如果多個執行緒同時存取LinkedList,則必須自行實現存取同步,或者另一個解決方法是在建立List時建構一個同步的List。

         (2)、ArrayList  實作了變化大小的數組,讓所有元素包含null,同時ArrayList也不是執行緒安全的。

         (3)、Vector類似ArrayList,但Vector是執行緒安全的。

         (4)、Stack繼承自Vector,實作一個後進先出的堆疊。

            Vector、ArrayLis和LinkedList比較:

            (1)Vector為執行緒安全的,ArrayList和LinkedList不是線程。

            (2)ArrayList和Vector是實作了基於動態陣列的資料結構而LinkedList是基於鍊錶的資料結構。

            (3)陣列與鍊錶的查詢,刪除等的效能。


 2)、set是一個不允許有重複元素的集合。 set的實作類別有Hashset和Treeset。 HashSet依賴HashMap,實際上是透過HashMap實現的;TreeSet依賴TreeMap,透過TreeMap來實現的。

     

二、Map是一個映射接口,採用key-value鍵值對的方式。

        AbstractMap是一個抽象類別,它實作了Map介面中大部分的API,而HashMap、TreeMap和WeakHashMap都是繼承於AbstractMap,HashTable雖然繼承於Dictionary,但它實作了Map介面。


1)、HashTable

        (1)HashTable繼承Map介面,實作一個key-value對應的哈希表,任何非空的物件都可作為key或value。

        (2)新增資料put、取出資料get兩個運算的時間開銷為常數。

        (3)由於作為key的物件是透過計算其雜湊函數來確定與之對應的value的位置,因此任何作為key的物件都必須實現hashCode和equals方法。 hashCode和equals方法都是繼承自根類別Object

        (4)HashTable是執行緒安全的。


2)、HashMap

        (1)HashMap和HashTable類似,但HashMap是非執行緒安全的,且允許key和value都為空。

        (2)將HashMap視為Collection時,其迭代操作時間開銷和HashMap的容量成正比,如果迭代性能的操作相當重要的話,不要將HashMap的初始化容量捨得過高。


3)、TreeMap

        (1)HashMap透過Hashcode對其內容進行快速查找,無序的,而TreeMap中所有的元素都保持著某種固定的順序,有序的。

        (2)TreeMap沒有調優選項,因為該樹總是處於平衡狀態。


4)、WeakHashMap

          (1) WeakHashMap是改良的HashMap,它對key實行「弱引用」,如果一個key不再被外部所引用,那麼該key可以被GC回收。

  

總結

(1)如果涉及堆疊,佇列等操作,應該考慮用List;對於需要快速插入,刪除元素,應該使用LinkedList;如果需要快速隨機存取元素,應該使用ArrayList。

(2)如果程式在單執行緒環境中,或存取僅在一個執行緒中進行,考慮非同步的類,其效率較高;如果多個執行緒可能同時操作一個類,應該使用同步的類。

(3)要特別注意對雜湊表的操作,作為key的物件要正確複寫equals和hashCode方法。

(4)使用Map時,尋找、更新、刪除、新增最好使用HashMap或HashTable;對Map進行自然順序或自訂鍵順序遍歷時,最好使用TreeMap;

(5)盡量回傳介面而非實際的類型,例如回傳List而非ArrayList,這樣如果以後需要將ArrayList換成LinkedList時,客戶端程式碼就不用改變。這就是針對抽象程式。


Collection介面原始碼

public interface Collection<E> extends Iterable<E> {
    int size(); //大小
    boolean isEmpty();//是否为空
    boolean contains(Object o); //是否包含某个对象
    Iterator<E> iterator(); //迭代
    Object[] toArray(); //转化为数组
    <T> T[] toArray(T[] a);
    boolean add(E e); //增加对象
    boolean remove(Object o); //删除对象
    boolean containsAll(Collection<?> c); //判断是否包含相同的Collection
    boolean addAll(Collection<? extends E> c); //将Collection追加到
    boolean removeAll(Collection<?> c); //删除所有相同对象
    default boolean removeIf(Predicate<? super E> filter) {
        Objects.requireNonNull(filter);
        boolean removed = false;
        final Iterator<E> each = iterator();
        while (each.hasNext()) {
            if (filter.test(each.next())) {
                each.remove();
                removed = true;
            }
        }
        return removed;
    }
    boolean retainAll(Collection<?> c);
    void clear();
    boolean equals(Object o);
    int hashCode();
    @Override
    default Spliterator<E> spliterator() {
        return Spliterators.spliterator(this, 0);
    }
    default Stream<E> stream() {
        return StreamSupport.stream(spliterator(), false);
    }
    default Stream<E> parallelStream() {
        return StreamSupport.stream(spliterator(), true);
    }
}

以上是Java集合之Collection具體詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn