我的Java之旅 第五課 JAVA 語言語法 集合。本站提示廣大學習愛好者:(我的Java之旅 第五課 JAVA 語言語法 集合)文章只能為提供參考,不一定能成為您想要的結果。以下是我的Java之旅 第五課 JAVA 語言語法 集合正文
JAVA集合只能存放引用類型的的數據,不能存放基本數據類型,int 可以用 Integer代替。
一、集合接口
1、 Iterable<E> 實現這個接口允許對象成為 "foreach" 語句的目標。
2、 Collection<E> 接口擴展了Iterable 接口。該接口是Collection 層次結構中的根接口。
集合類的基本接口 是Collection 接口,該接口有兩個基本方法 : add (向集合添加元素) 和 iterator ( 返回一個實現了Iterator 接口的 對象)。
還有很多有用的方法,如size、isEmpty、contains 等等。而為了能夠讓實現者更容易地實現這個接口,java類庫提供了一個類 AbstractCollection。它將基礎方法size和iterator抽象化了,但是在此提供了例行方法。
3、 Iterator<E> 接口。對 collection 進行迭代的迭代器。替代了 Enumeration接口。包含三個方法:
next 、
hasNext 調用next方法前應該先執行hasNext方法判斷是否還有下一個元素
remove 刪除上次調用next方法時返回的元素。
二、具體的集合
以上以Map結尾的實現了Map接口,其它全部實現了Collection接口。
★ArrayList 數組列表 實現了List接口
另一個動態數組類 Vector類 ,此類的所有方法是同步的,而ArrayList中的方法不是同步的。當不需要同步時使用ArrayList,以節省資源。
數組和數組列表從中間位置刪除一個元素要付出很大代價,原因是數組中處於被刪除元素之後的所有元素都要向數組的前端移動。插入一個元素也是如此。下邊的鏈表解決了這個問題。
★ LinkedList 鏈表 實現了List接口
java中所有鏈表實際上都是雙向鏈接的,即每個結點還存放著指向前驅結點的引用。這樣從鏈表刪除一個元素時只需要對被刪除元素附近的結點更新一下即可。
鏈表與泛型一個重要區別。鏈表是有序集合,每個對象的位置十分重要。
鏈表不支持快速地隨機訪問。如果要查看鏈表中第n個元素,必須從頭開始,越過n-1個元素。因此,當需要采用整數索引訪問元素時,通常不選用鏈表。盡管如此,LinkedList類還是提供了一個get方法,用來獲取第n個元素,效率當然不高。
★散列集 (HashSet)
散列表可以快速地查找所需要的對象,散列表為每個對象計算一個整數,稱為散列碼。
在java中散列表用鏈表數組實現。
散列表可以用於實現幾個重要的數據結構。其中最簡單的是set類型。set類型是沒有重復元素的元素集合。(保證無重復:當添加元素時如果此 set 沒有包含滿足 (e==null ? e2==null : e.equals(e2)) 的元素 e2,則向該 set 中添加指定的元素 e。如果此 set 已經包含該元素,則該調用不改變此 set 並返回 false。結合構造方法上的限制,這就可以確保 set 永遠不包含重復的元素。)
java集合類庫提供了一個HashSet類,實現set接口,實現了基於散列表的集。當不關心集合中元素的順序時才應該使用HashSet。
★ 樹集 (TreeSet)
TreeSet類與散列集十分類似,不過,樹集是一個有序集合。排序是用樹結構完成的。
每次添加元素時,都被放置在正確的位置上。因此,添加到樹中比添加到散列表中慢。
關於對象的比較 傳遞Comparator對象給TreeSet 構造器。
與散列集比較,當不需要排序時用散列集,需要時用樹集,以節省開銷。
★ 隊列與雙端隊列
隊列可以讓人們有效地在尾部添加一個元素,在頭部刪除一個元素。
雙端隊列即兩個端頭,可以有效地在頭部和尾部同時添加或刪除元素。不支持在中間添加元素。
Deque接口,由ArrayDeque和LinkedList類實現,這兩個類都提供了雙端隊列。而且必要時可以增加隊列的長度。
優先級隊列(PriotiryQueue)
優先級隊列中的元素可以按照任意的順序插入,卻總是按照排序的順序進行檢索。也就是說無論何時調用remove方法,總會獲得優先級隊列中最小的元素。 優先級隊列使用數據結構為堆(heap)。堆是一個可以自我調整的二叉樹,對樹執行添加和刪除操作,可以讓最小的元素移動到根,而不必花費時間對元素進行排序。d而迭代並不是按照元素的排列順序訪問的。
使用優先級隊列的典型示例是任務調度。
★ 映射表
映射表存放鍵/值對。
映射表數據結構實現通過某些鍵查找與之對應的元素的需求。
Java類庫中兩個通用的實現:HashMap和TreeMap。這兩個類實現了Map接口。與集一樣,如果不需要排序,就選擇散列HashMap。
集合框架沒有將映射表本身視為一個集合,而是提供了映射表的視圖,這是一組實現了Collection接口對象,或者它的子接口的視圖。
這三個視圖為:鍵集(keySet)、值集合(values)和鍵/值對集(entrySet)。
★ 專用集與映射表集
1 弱散列映射集。 負責從長期存活的映射表中刪除無用的值。
WeakHashMap 類
2 鏈接散列集和鏈接映射表。用來記住插入元素項的順序。
LinkedHashSet類和 LinkedHashMap類
鏈接散列映射表用訪問順序而不是插入順序對映射表條目進行迭代。訪問順序對實現高速緩存的“最近最少使用"原則十分重要。
3 枚舉集和映射表
EnumSet是一個枚舉類型元素集的高效實現。 可以使用Set接口的常用方法修改EnumSet。
EnumMap是一個鍵類型為枚舉類型的映射表。它可以直接且高效地用一個值數組實現。
4 標識散列映射表
IdentityHashMap。不同的鍵對象,即使內容相同,也被視為不同的對象。這個特性可以用來跟蹤每個對象的遍歷狀況。
★ 集合框架
集合有兩個基本的接口:Collection 和 Map。
List接口是一個有序集合。
RandomAccess接口。沒有任何方法,但可以用來檢測一個特定的集合是否支持高效的隨機訪問。
ListIterator接口定義了一個方法,用於將一個元素添加到迭代器所處位置的前面。
Set接口與Collection接口是一樣的,只是其方法的行為有著更嚴謹的定義。(Set拒絕添加重復元素)。
SortedSet和SortedMap接口暴露了用於排序的比較器對象,並且定義的方法可以獲得集合的子集視圖。
最後,Java SE 6 引入了接口NavigableSet和NavigableMap,其中包含了幾個用於在有序集和映射表中查找和遍歷的方法。TreeSet和TreeMap類實現了這幾個接口。
★ 遺留的集合
1 Hashtable類
與HashMap作用一樣。
2 枚舉
Enumeration接口對元素序列進行遍歷。有兩個方法hasMoreElements和nextElement 類似於Iterator接口的hasNext方法和next方法。
3 屬性映射表
一個類型非常特殊的映射表結構。3個特性:鍵與值都是字符串;表可以保存到一個文件中,也可以從文件中加載;使用一個默認的輔助表。
4 棧
Stack類。Stack類擴展為Vector類
5 位集
BitSet類