lesson8:java的集合類

一.爲什麼需要集合類

我們在編程時,常常需要集中存放多個數據,這個時候,我們可能會想到數組,但是數組的長度是固定的,於是我們就有了集合,java中的集合類是特別有用的工具,可以存放數量不等的多個對象,並且可以實現映射關係的關聯數組。

二.java集合的框架

java集合的框架主要有Collection和Map這兩個頂級接口派生出來,Collection下有Set(無序不可重複集合)、List(有序可重複集合),Queue(隊列,FIFO原則),這三大接口,Map則是一一對應的鍵值對形式的集合類。給大家摘兩張來自瘋狂java講義的集合框架圖
在這裏插入圖片描述
在這裏插入圖片描述
Collection集合主要有以下方法:
boolean add(E e) 確保此 collection 包含指定的元素(可選操作)。
boolean addAll(Collection<? extends E> c) 將指定 collection 中的所有元素都添加到此 collection 中(可選操作)。
void clear() 移除此 collection 中的所有元素(可選操作)。
boolean contains(Object o) 如果此 collection 包含指定的元素,則返回 true。
boolean containsAll(Collection<?> c) 如果此 collection 包含指定 collection 中的所有元素,則返回 true。
boolean equals(Object o) 比較此 collection 與指定對象是否相等。
int hashCode() 返回此 collection 的哈希碼值。
boolean isEmpty() 如果此 collection 不包含元素,則返回 true。
Iterator iterator() 返回在此 collection 的元素上進行迭代的迭代器。
boolean remove(Object o) 從此 collection 中移除指定元素的單個實例,如果存在的話(可選操作)。
boolean removeAll(Collection<?> c) 移除此 collection 中那些也包含在指定 collection 中的所有元素(可選操作)。
boolean retainAll(Collection<?> c) 僅保留此 collection 中那些也包含在指定 collection 的元素(可選操作)。
int size() 返回此 collection 中的元素數。
Object[] toArray() 返回包含此 collection 中所有元素的數組。
T[] toArray(T[] a) 返回包含此 collection 中所有元素的數組;返回數組的運行時類型與指定數組的運行時類型相同。

1.List接口

List是Collection子接口,可以用Collection中所有的方法,集合中數據都是有序可重複的數據。可以通過索引來找到指定的集合元素,它添加了一些根據索引來操作集合元素的方法。
void add(int index, E element) 在列表的指定位置插入指定元素(可選操作)。
boolean addAll(int index, Collection<? extends E> c) 將指定 collection 中的所有元素都插入到列表中的指定位置(可選操作)。
E get(int index) 返回列表中指定位置的元素。
int lastIndexOf(Object o) 返回此列表中最後出現的指定元素的索引;如果列表不包含此元素,則返回 -1。
E remove(int index) 移除列表中指定位置的元素(可選操作)。
E set(int index, E element) 用指定元素替換列表中指定位置的元素(可選操作)。
List subList(int fromIndex, int toIndex) 返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之間的部分集合。
List集合中比較集合類元素是否相同的方法只是比較對象的equals方法
List接口的幾個子類
ArrayList和Vector,默認長度是10, Vector是線程安全的,而Arraylist不是,可以調用Collections.synchronizedList(list)這個方法,手動使得線程安全。Vector還有個Stack的子類,模擬了棧(FILO)的數據結構,提供了以下幾個方法:
boolean empty()
查看堆棧是否爲空。
E peek()
查看堆棧頂部的對象,但不從堆棧中移除它。
E pop()
移除堆棧頂部的對象,並作爲此函數的值返回該對象。
E push(E item)
把項壓入堆棧頂部。
int search(Object o)
返回對象在堆棧中的位置,以 1 爲基數。

2.Queue接口

模擬了隊列的數據結構(FIFO),隊頭數據保持時間最長,隊尾保持時間最短,插入(offer)數據是插到隊尾,訪問(poll)數據是訪問對頭。通常隊列不容許隨機訪問。
定義了以下常用的方法:
boolean add(E e)
將指定的元素插入此隊列(如果立即可行且不會違反容量限制)的尾部,在成功時返回 true,如果當前沒有可用的空間,則拋出 IllegalStateException。
E element()
獲取,但是不移除此隊列的頭。
boolean offer(E e)
將指定的元素插入此隊列(如果立即可行且不會違反容量限制)的尾部,當使用有容量限制的隊列時,此方法通常要優於 add(E),後者可能無法插入元素,而只是拋出一個異常。
E peek()
獲取但不移除此隊列的頭;如果此隊列爲空,則返回 null。
E poll()
獲取並移除此隊列的頭,如果此隊列爲空,則返回 null。
E remove()
獲取並移除此隊列的頭。
Queue的幾個子類:
LinkList是Queue的實現,既是List的實現類(可以隨機訪問元素),但是訪問並不是很好,因爲基於鏈表實現的,又實現了Dequeue接口(雙向隊列),可以進行隊列的操作。
查看Api我們得知,LinkList有以下常用方法:
boolean add(E e)
將指定元素添加到此列表的結尾。
void add(int index, E element)
在此列表中指定的位置插入指定的元素。
boolean addAll(Collection<? extends E> c)
添加指定 collection 中的所有元素到此列表的結尾,順序是指定 collection 的迭代器返回這些元素的順序。
boolean addAll(int index, Collection<? extends E> c)
將指定 collection 中的所有元素從指定位置開始插入此列表。
void addFirst(E e)
將指定元素插入此列表的開頭。
void addLast(E e)
將指定元素添加到此列表的結尾。
void clear()
從此列表中移除所有元素。
Object clone()
返回此 LinkedList 的淺表副本。
boolean contains(Object o)
如果此列表包含指定元素,則返回 true。
Iterator descendingIterator()
返回以逆向順序在此雙端隊列的元素上進行迭代的迭代器。
E element()
獲取但不移除此列表的頭(第一個元素)。
E get(int index)
返回此列表中指定位置處的元素。
E getFirst()
返回此列表的第一個元素。
E getLast()
返回此列表的最後一個元素。
int indexOf(Object o)
返回此列表中首次出現的指定元素的索引,如果此列表中不包含該元素,則返回 -1。
int lastIndexOf(Object o)
返回此列表中最後出現的指定元素的索引,如果此列表中不包含該元素,則返回 -1。
ListIterator listIterator(int index)
返回此列表中的元素的列表迭代器(按適當順序),從列表中指定位置開始。
boolean offer(E e)
將指定元素添加到此列表的末尾(最後一個元素)。
boolean offerFirst(E e)
在此列表的開頭插入指定的元素。
boolean offerLast(E e)
在此列表末尾插入指定的元素。
E peek()
獲取但不移除此列表的頭(第一個元素)。
E peekFirst()
獲取但不移除此列表的第一個元素;如果此列表爲空,則返回 null。
E peekLast()
獲取但不移除此列表的最後一個元素;如果此列表爲空,則返回 null。
E poll()
獲取並移除此列表的頭(第一個元素)
E pollFirst()
獲取並移除此列表的第一個元素;如果此列表爲空,則返回 null。
E pollLast()
獲取並移除此列表的最後一個元素;如果此列表爲空,則返回 null。
E pop()
從此列表所表示的堆棧處彈出一個元素。
void push(E e)
將元素推入此列表所表示的堆棧。
E remove()
獲取並移除此列表的頭(第一個元素)。
E remove(int index)
移除此列表中指定位置處的元素。
boolean remove(Object o)
從此列表中移除首次出現的指定元素(如果存在)。
E removeFirst()
移除並返回此列表的第一個元素。
boolean removeFirstOccurrence(Object o)
從此列表中移除第一次出現的指定元素(從頭部到尾部遍歷列表時)。
E removeLast()
移除並返回此列表的最後一個元素。
boolean removeLastOccurrence(Object o)
從此列表中移除最後一次出現的指定元素(從頭部到尾部遍歷列表時)。
E set(int index, E element)
將此列表中指定位置的元素替換爲指定的元素。
int size()
返回此列表的元素數。
PriorityQueue是一個比較標準的隊列的實現類,它的peek和poll是按照取出最小的元素來取得,它有個元素實現Comparable這個接口的概念,所以不能添加null。它的隊列元素排序有兩種。一種是自然的排序:指的是集合元素是同類別的實現了comparable這個接口的排序,另外一種是創建集合是傳入Comparator對象,這個對象負責給元素排序,採用此排序時,不要求所有元素都實現comparable這個接口

3.Set接口

Set集合中存放的元素是不可重複的無序的元素,在Collection基礎上沒有提供額外的方法,不過是以不同的行爲即不可重複的元素,Set比較元素是否相同只是比較equals方法。
Set接口的幾個子類,
HashSet是一個常用的實現類,它不能保證元素的順序,不可重複,不是線程安全的,它是按照hash算法你來存儲元素的。集合元素可以爲 NULL的幾個特點,其底層其實是一個數組,存在的意義是加快查詢速度。我們知道在一般的數組中,元素在數組中的索引位置是隨機的,元素的取值和元素的位置之間不存在確定的關係,因此,在數組中查找特定的值時,需要把查找值和一系列的元素進行比較,此時的查詢效率依賴於查找過程中比較的次數。而 HashSet 集合底層數組的索引和值有一個確定的關係:index=hash(value),那麼只需要調用這個公式,就能快速的找到元素或者索引。對於 HashSet: 如果兩個對象通過 equals() 方法返回 true,這兩個對象的 hashCode 值也應該相同。
b.LinkHashSet,是HashSet的子類。不可以重複,有序的,因爲底層採用鏈表和哈希表的算法。鏈表保證元素的添加順序,哈希表保證元素的唯一性,相對於HashSet它的效率會低一些,但是迭代全部元素時會有更好的性能,因爲它以鏈表的形式來維護內部順序。
c.TreeSet,它是SortSet唯一子類,確保元素排序,排序方法並不是按照插入順序是根據集合中的元素的compareTo(Obj obj)方法排序,類似於PriorityQueue的排序。
d.EnumSet,添加枚舉類型的集合,不可以添加NULL,有序的,按照在枚舉類中順序添加到集合中去。

4.Map接口

Map用於保存映射關係的數據集合。
Map與Set相似,有HashMap、LinkHashMap、TreeMap,EnumMap等。定義了以下方法:
void clear()
刪除映射中移除所有映射關係(可選操作)。
boolean containsKey(Object key)
如果此映射包含指定鍵的映射關係,則返回 true。
boolean containsValue(Object value)
如果此映射將一個或多個鍵映射到指定值,則返回 true。
Set<Map.Entry<K,V>> entrySet()
返回此映射中包含的映射關係的 Set 視圖。
boolean equals(Object o)
比較指定的對象與此映射是否相等。
V get(Object key)
返回指定鍵所映射的值;如果此映射不包含該鍵的映射關係,則返回 null。
int hashCode()
返回此映射的哈希碼值。
boolean isEmpty()
如果此映射未包含鍵-值映射關係,則返回 true。
Set keySet()
返回此映射中包含的鍵的 Set 視圖。
V put(K key, V value)
將指定的值與此映射中的指定鍵關聯(可選操作)。
void putAll(Map<? extends K,? extends V> m)
從指定映射中將所有映射關係複製到此映射中(可選操作)。
V remove(Object key)
如果存在一個鍵的映射關係,則將其從此映射中移除(可選操作)。
int size()
返回此映射中的鍵-值映射關係數。
Map的幾個子類
HashMap和Hashtable,他們都是Map的實現類,類似於ArrayList和Vector,一個是非線程安全,一個是線程安全,Hashtable從jdk1.0,基本已經棄用,如果考慮到線程安全,可以使用Collctions工具類將HashMap變成線程安全類。他們都與HashSet存儲元素的方式一樣,比較集合類元素value是否相等,只是比較equals方法,如果是比較key則是需要比較equals和hashcode
2.LinkHashMap,它是HashMap的子類,內部由雙向鏈表維護key-value的次序,迭代順序與插入順序一致。
3.TreeMap,類似於TreeSet.

本文只是對java集合類做個簡單的介紹總結。如有不當之處,煩請大神指出。

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