說明:左圖爲簡化圖(其中粗線部分是重點的容器),右圖爲完整容器分類圖html
2.1 說明java
容器接口是容器的基礎。使用接口能夠將容器的實現與容器接口分開,於是可使用相同的方法訪問容器而不需關心容器具體的數據結構。算法
同理,Iterator接口也使用戶可以使用相同的方法訪問不一樣的容器類。編程
2.2 容器接口(Collection,Map,Iterator)數組
1)collection接口安全
* boolean add(Object obj): 添加對象,集合發生變化則返回true * Iterator iterator():返回Iterator接口的對象 * int size() * boolean isEmpty() * boolean contains(Object obj) * void clear()
* <T> T[] toArray(T[] a)
2)Map接口(存放鍵值對,Map中的值也能夠是一個容器)數據結構
* Object get(Object key) * Object put(Object key, Object value) * Set keySet() : returns the keys set Set<K> keySet() * Set entrySet(): returns mappings set Set<Map.Entry<K,V>> entrySet() * containsKey() * containsValue()
3)Iterator接口多線程
* Object next() * boolean hasNext() * void remove()
注意:remove函數不能連續執行屢次,不然返回IllegalStateException
app
( if the next method has not yet been called, or the remove method has already been called after the last call to the next method.)less
一般用法:
Iterator it=collection.iterator(); while(it.hasNext()) { Object obj=it.next(); //do something }
2.3 子接口(List,Set,ListIterator,SortedMap,SortedSet)
1)List(有順序能夠重複,有順序因此操做時能夠在方法中加入索引參數,以下:)
* boolean add(E element)
* void add(int index, E element)
* E set(int index, E element)
* E get(int index);
2)Set(無順序不能夠重複,無序於是不能經過索引操做對象)
3)ListIterator(Iterator for List,List是雙向表,於是在Iterator上增長了一些新的方法,容許traverse the List in either direction)
* boolean hasPrevious(); * E previous(); * int previousIndex()
4) SortedMap
說明:保證按照鍵的升序排列的映射,能夠按照鍵的天然順序( Comparable 接口)進行排序, 或者經過建立有序映射時提供的比較器進行排序
(A that further provides a total ordering on its keys. The map is ordered according to the natural ordering of its keys, or by a typically provided at sorted map creation time)MapComparator
public interface SortedMap<K,V>extends Map<K,V>
* Comparator comparator()
* Object firstKey()
* Object lastKey()
5)SortedSet
主要用於排序操做,實現此接口的子類都是排序的子類
public interface SortedSet<E>extends Set<E>
* Comparator comparator()
* E first() :返回第一個元素
* E last()
* SortedSet<E> headSet(E toElement): 返回less than toElement
* SortedSet<E> tailSet(E fromElement)
* SortedSet<E> subSet(E fromElement)
2.4抽象容器類
1)說明:使用抽象容器類能夠方便的定義類,而不用在每一個類中都實現容器接口container 中的全部的方法
2)包含:
* AbstractCollection public abstract class AbstractCollection<E>extends Objectimplements Collection<E> * AbstractList public abstract class AbstractList<E>extends AbstractCollection<E>implements List<E> * AbstractSet public abstract class AbstractSet<E>extends AbstractCollection<E>implements Set<E> * AbstactMap public abstract class AbstractMap<K,V>extends Object implements Map<K,V> * AbstractSequentialList public abstract class AbstractSequentialList<E> extends AbstractList<E>
3.1歸納
1)collection: ArrayList,LinkedLsit,Vector,Stack
TreeSet,HashSet,LinkedHashSet
2) Map: HashMap,LinkedHashMap,WeakHashMap, TreeMap, HashTable, IdentityHashTable(其中key的比較是經過==而不是equals)
3.2經常使用的容器類
1)ArrayList 與 LinkedList(均非同步,多線程時須要考慮線程安全問題),Vector(同步),Stack
1. List 接口支持經過索引的方法來訪問元素:ArrayList 隨機訪問快改慢;LinkedList改快隨機訪問慢;Vector實現了同步,於是比ArrayList慢
2. LinkedList使用雙向鏈表實現LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操做使LinkedList可被用做堆棧(stack),隊列(queue)或雙向隊列(deque)。
3. ArrayList沒有定義增加算法,當須要插入大量元素是,可調用ensureCapacity方法提升添加效率
4. Vector相似與ArrayList,可是是同步的,多線程安全(另一點區別是ArrayList擴容時默認增加一半,Vector增加一倍)。不管是單線程仍是多線程,Vector都比ArrayList慢
5. Stack繼承自Vector,實現一個後進先出的堆棧
6.若須要實現同步能夠調用Collections工具類的synchronizedList方法,以下:
List list = Collections.synchronizedList(new ArrayList()); synchronized(list) { Iterator i = list.iterator(); // Must be in synchronized block while (i.hasNext()) foo(i.next()); } 或者: List list = Collections.synchronizedList(new LinkedList());
7.定義以下:(注意LinkedList實現了Deque)
public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
public class LinkedList<E>extends AbstractSequentialList<E>implements List<E>, Deque<E>, Cloneable, Serializable
public class Vector<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
2)TreeSet, HashSet, LinkedHashSet(HashSet,TreeSet不是線程安全的)
1. TreeSet是SortedSet接口的惟一實現類,TreeSet能夠確保集合元素處於排序狀態,效率很高,可提升程序的效率;TreeSet經過compareTo或者compare排序,於是只要值相等即便equals不等(不一樣對象)也不能加到集合中(fails to obey Set interface)
2. HashSet,效率很高,和TreeSet不一樣的是經過比較對象的equals區分不一樣對象,這樣不一樣的對象能夠不被重複的加入到集合中。
hashCode()函數很差肯定,對象默認的hashCode函數試對象的內存地址值,hashCode函數的好壞是HashSet性能的關鍵。
3. LinkedHashSet,和HashSet相同,一樣是根據元素的hashCode值來決定元素的存儲位置,可是它同時使用鏈表維護元素的次序。LinkedHashSet在迭代訪問Set中的所有元素時,性能比HashSet好,可是插入時性能稍微遜色於HashSet。
4. Set能夠插入null,最多一個null
3) HashMap(非同步), HashTable(線程安全), TreeMap, WeakHashMap
1.HashTable與HashMap區別:(詳情請查看HashTable與HashMap)
1) Hashtable繼承自Dictionary類,而HashMap繼承自AbstractMap類。但兩者都實現了Map接口。
2) Hashtable 中的方法是Synchronize的,而HashMap中的方法在缺省狀況下是非Synchronize的
3)Hashtable中,key和value都不容許出現null值;HashMap中,null能夠做爲鍵,這樣的鍵只有一個;能夠有一個或多個鍵所對應 的值爲null
4) HashTable直接使用對象的hashCode。而HashMap從新計算hash值。
2. WeakHashMap是一種改進的HashMap,它對key實行「弱引用」,WeakHashMap使用元素的引用而不是值做爲key,也就是說必須在引用相同(a==b)的狀況下才能找到相關的值。另外,若是一個key再也不被外部所引用,那麼該key能夠被GC回收。
3. TreeMap是SortedMap接口的基於紅黑樹的實現。此類保證了映射按照升序順序排列關鍵字, 根據使用的構造方法不一樣,可能會按照鍵的類的天然順序進行排序
4.定義以下:
public class Hashtable extends Dictionary implements Map, Cloneable, Serializable public class HashMap extends AbstractMap implements Map, Cloneable, Serializable public class TreeMap<K,V>extends AbstractMap<K,V>implements NavigableMap<K,V>, Cloneable, Serializable
1)使用抽象編程思想,建立時使用父類引用指向子類對象,返回時返回抽象接口
2)若是涉及到堆棧,隊列等操做,應該考慮用List,對於須要快速插入,刪除元素,應該使用LinkedList,若是須要快速隨機訪問元素,應該使用ArrayList。
3)若是程序在單線程環境中使用非同步的類,其效率較高
4)可使用Collections 工具類中unmodifiableList/unmodifiableMap/unmodifiableSet/unmodifiableSortedMap/unmodifiableSortedSet等建立不能修改的List,Map,List等
5)可使用Collections工具類中Collections.synchronizedList(new ArrayList())等實現同步
6) 可使用Arrays.equal()判斷兩個數組是否相等