Collection ├List │├LinkedList │├ArrayList │└Vector │ └Stack └Set Map ├Hashtable ├HashMap
└WeakHashMap
一、基礎內容
容器就是一種裝其他各種對象的器皿。java.util包
容器:Set, List, Map ,數組。只有這四種容器。
Collection(集合) 一個一個往裏裝,Map 一對一對往裏裝。
Set:沒有順序,不可以重複。 List:有順序,可以重複。 互相的equals就算重複。
Map定義了存儲Key-Value的方法。
Collection裏裝的必須都是Object,不能是基礎類型。比如Int類型的值分配在棧上,而棧上的內容都是動態的。
容器類對象在調用remove,cotains等方法時,需要比較對象是否相等,這會涉及到對象類型的equals方法和hashCode方法,對於自定義的類型,需要重寫equals方法和hashCode方法以實現自定義對象相等。
原則: 如果要重寫equals方法,那必須重寫hashCode方法。兩個對象互相equals,那這兩個對象必須具有相同的hashCode。
比較兩個對象是不是相等的時候,主要用的是equals方法,當對象用在Map裏面作爲鍵時用hashCode方法,這樣效率比較高。當對象當做鍵的時候,hashCode會有用。
兩個對象如果互相equals,那麼他們的hashCode一定相等。
二、HashMap,Hashset,ArrayList以及LinkedList集合的區別,以及各自的用法:
HashMap:HashMap實現了Map接口,底層使用的是Hash算法存儲數據。HashMap將數據以鍵值對的方式存儲。
HashSet:HashSet實現了Set接口,底層也是用的是Hash算法存儲數據。而且HashSet內部有HashMap類型的成員變量,方法也調用了HashMap的方法,存儲的時候只不過值爲null.
ArrayList:ArrayList實現了List接口,底層使用的是數組,存儲空間上是相鄰的,所以查詢起來會很方便,效率也會比LinkedList要高
LinkedList:實現了List接口,底層使用的是使用雙向鏈表的形式,存儲的數據在空間上很可能不相鄰,但是他們都有一個引用連在一起,所以增刪起來會很方便
Vector與ArrayList十分相似,區別就是就是vector是一種線程安全類,它的方法都帶有Synchronized關鍵字,實際中很少用到。如果遇到多線程的問題,JAVA提供了一個Collections工具類,可以把ArrayList轉換成線程安全的類。
三、LinkedList類 LinkedList實現了List接口,允許null元素。此外LinkedList提供額外的get,remove,insert方法在LinkedList的首部或尾部。這些操作使LinkedList可被用作堆棧(stack),隊列(queue)或雙向隊列(deque)。 注意LinkedList沒有同步方法。如果多個線程同時訪問一個List,則必須自己實現訪問同步。一種解決方法是在創建List時構造一個同步的List: List list = Collections.synchronizedList(new LinkedList(...)); ArrayList類 ArrayList實現了可變大小的數組。它允許所有元素,包括null。ArrayList沒有同步。 size,isEmpty,get,set方法運行時間爲常數。但是add方法開銷爲分攤的常數,添加n個元素需要O(n)的時間。其他的方法運行時間爲線性。 每個ArrayList實例都有一個容量(Capacity),即用於存儲元素的數組的大小。這個容量可隨着不斷添加新元素而自動增加,但是增長算法並沒有定義。當需要插入大量元素時,在插入前可以調用ensureCapacity方法來增加ArrayList的容量以提高插入效率。 和LinkedList一樣,ArrayList也是非同步的(unsynchronized)。 HashMap類 HashMap繼承Map接口,實現一個key-value映射的哈希表。任何非空(non-null)的對象都可作爲key或者value。 總結 如果涉及到堆棧,隊列等操作,應該考慮用List,對於需要快速插入,刪除元素,應該使用LinkedList,如果需要快速隨機訪問元素,應該使用ArrayList。