1)集合框架
1)引言
Java集合框架,用於存儲數據,並提供方法支持查找、插入和刪除。
Java集合框架支持兩種類型的容器:
存儲元素的集合,稱爲集合(collection);
存儲鍵值對,稱爲圖(map)
2)集合(Collection)
集合總共有3種類型:線性表(List)、規則集(Set)、隊列(Queue)。
線性表:一個存儲有序元素的集合
規則集:一個存儲不重複元素的集合
隊列:一個存儲用先進先出方式處理的對象的集合。
常用方法:
boolean add(E e):向集合中添加新元素e(這裏E是泛型,代表所有類型,以下不作解釋)
boolean addAll(Collection<? Extends E> c):向集合中添加集合c的所有元素
boolean contains(Object o):判斷是否存在元素o
boolean containsAll(Collection<?> c):判斷是否存在集合c的所有元素
void clear():刪除所有元素
boolean remove(Object o):刪除元素o
boolean removeAll(Collection<?> c):刪除屬於集合c的所有元素
int size():返回集合元素個數
isEmpty():判斷集合是否爲空
List接口:線性表
其三個具體類是:Vector、ArrayList、LinkedList
Vector:向量類,其內部的數據結構是一個數組,是線程同步的,相對ArrayList,效率更低。
ArrayList:數組線性表,其內部數據結構是一個大小可變的數組,是線程不同步的。
LinkedList:,是實現List接口的一個鏈表。
對於ArrayList和LinkedList的使用應根據需要進行選擇,如果需要快速查詢,不要求插入與刪除,則選擇ArrayList;反之,選擇LinkedList。
Set接口:規則集
Set的底層實現依賴於Map,其三個具體類是:HashSet、LinkedHashSet、TreeSet
HeshSet:散列集,繼承AbstractSet抽象類,其集合中的元素沒有特定的順序。
LinkedHashSet:鏈式散列集,繼承HashSet,擴展了HashSet類,可對規則集內的元素排序。
TreeSet:樹形集,實現了SortedSet,NavigableSet接口的具體類,對規則集內的元素有兩種排序方式:一是自然排序,使用Comparable接口的排序規則;二是自定義排序,實現Comparator接口,自定義一種排序規則。
以下展示自定義排序:
Queue:隊列,是一種先進先出的數據結構。優先隊列中,元素具有優先級,擁有最高優先級的元素最先被刪除。(這一種基本沒接觸過,這裏不作詳細討論)
3)圖(Map)
圖是一種存儲鍵值對的數據結構。集合中的下標在圖中稱爲鍵值,且圖中的鍵值可以是任意類型的,不一定是整數。圖中不能有重複的鍵值,每一個鍵值對應一個值。
圖的類型有三種,散列圖HashMap、鏈式散列圖LinkedHashMap、樹形圖TreeMap。
關係圖:
HashMap:散列圖,其類中的條目是沒有順序的。
LinkedHashMap:鏈式散列圖,繼承自HashMap,可對元素進行排序,排序分兩種,一種是插入排序,通過默認構造函數創建;另一種是訪問順序排序,通過LinkedHashMap(initialCapacity, loadFactor,true)創建
TreeMap:樹形圖,鍵值可以使用Comparable接口或Comparator接口排序
下面展示map的簡單操作:
2)泛型
1)引言
泛型是指參數化類型的能力。
使用泛型主要的優點是使得運行時會出現的ClassCastException在編譯時就能檢測出來。
此外,使用泛型還使得無需類型轉換就可以從一個元素類型已指定的列表中獲取值。
泛型類型必須是引用類型,這個導致集合框架存儲的數據也必須是引用類型。
泛型有泛型接口、泛型類、泛型方法。
2)泛型接口
此時T(也可以是其它字母如:S、U、V、E等等)代表任何引用類型,可以傳入String、Integer、自定類等等。
如:
3)泛型類
有兩個泛型參數時用」,」分隔
4)泛型方法
上面的Tool類中有兩個泛型方法,這裏要注意,靜態方法使用泛型時需要重新定義泛型,因爲它不能訪問在類型定義額泛型。
5)通配泛型
通配泛型類型有三種,第一種形式?稱爲非受限通配,它等同於? extends Object;第二種形式? Extends T稱爲受限通配,表示T或T的一個未知子類型;第三種?super T稱爲下限通配,表示T或T的一個未知類型。
6)泛型消除與對泛型的限制
泛型是使用一種稱爲泛型消除的方法來實現的。編譯器在編譯代碼時會通過泛型信息確認泛型類型是安全可用的,隨後會消除它。這種方法可以使泛型代碼兼容使用原始類型的遺留代碼。
使用泛型類型有一些限制:
不能使用new E();
不能使用new E[]();
靜態環境下不允許類的參數是泛型類型;
異常類不能是泛型的;