#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中文網其他相關文章!