【Java】Java中的集合框架、泛型
阿新 • • 發佈:2020-09-08
集合框架、泛型
1).Collection
集合:一類特殊的物件(用於儲存多個物件的物件) Collection:元素必須是引用型別,在遍歷時需要for each方式(因為資料沒有下標) Collection 重要的兩個子介面:①List ②Set Collection集合的重要的方法: add(E e) 順序的新增元素到集合中 remove(Object o) 從集合移除 size() 返回collection集合中的元素數量 Object[] toArray() 返回包含collection中所有元素的陣列 void clear() 移除collocation中所有的元素 boolean contains() 判斷集合是否包含特定元素 注: 在遍歷時要使用for(集合型別 引用名:陣列或集合);
2).List
元素內容可以重複,有順序也有下標(可用for遍歷,也可用for…each遍歷)
常見實現類: (1)ArrayList jdk1.2 底層陣列實現 查詢快,增刪慢 執行緒不安全 輕量級實現 效率高 (2)LinkedList jdk1.2 底層連結串列實現 查詢慢,增刪快 (3)Vector jdk1.1 底層陣列實現 查詢快,增刪慢 執行緒安全 重量級實現 效率低 常見方法: void add() 順序新增 void add(int index,E element) 指定下標插入 E get(int index) 指定下標獲取值 E remove(int index) 指定下標刪除 E set(int index,E element) 指定下標更新元素 size() 返回長度 indexOf(Object o) 獲取從前往後第一次出現的下標 List<E> subList(int fromIndex,int toIndex) 返回從fromindex到toindex-1處所有元素組成的子集合
3).Set
元素內容不可以重複,儲存沒有順序,而且無下標(只能用for…each遍歷)
常見實現類: (1)HashSet 新增元素過程: ①元素呼叫hashCode(),獲取雜湊碼,然後對長度求模(%),獲取下標(隨機性) ②如果在index處為空,則直接新增;否則使用equals比較兩個元素是否相同(可自己覆蓋其equals方法), 如果相同新增失敗,如果元素不同,則使用連結串列和前面的元素連起來 注意:開發中往往可能需要覆蓋父類的hashCode()和equals()方法; 如果是自定義型別,為保證元素的內容相同就是相同元素,我們必須重新hashCode和equals方法,其要求: 1)內容相同的物件(利用equals方法),必須放回相同的雜湊碼 2)內容不同的物件,極可能返回不同的雜湊碼 a) LinkedHashSet(繼承自HashSet):自定義型別,為保證元素內容不重複,必須必須重寫hashCode和equals方法;新增是有順序的,遍歷時和新增的時的順序一致 (2)SortedSet b) TreeSet(繼承自SortedSet):可以根據元素的內容自動升序排序,並且不重複。在自定義該集合型別時,為保證元素內容不重複,必須實現coMparable介面並實現compareTo方法 常見方法: void add(E e) 新增元素,儲存順序隨機 E remove(Object o) 指定元素刪除 int size() 返回長度 void clear() 清除所有元素 boolean contains(E e)判斷是否包含 HashSet jdk1.2 底層實現是散列表 LinkedHashSet jdk1.2 底層實現是散列表和連結串列 TreeSet jdk1.2 底層實現是紅黑樹
4).泛型
引數化型別、模板程式設計
定義型別時,使用型別變數代替;使用泛型型別時,必須傳入確切的型別,泛型預設型別時object型別,利用泛型技術可以構建元素型別安全的集合
List<Object> list = new List<>(); //系統會根據傳入的引數進行推斷其型別
List<T>………此處的T,可以是自定義的型別,比如自定義類
在定義類時也可以用泛型:
public class Student<T> {
public T method(){return T;}
}
泛型可約定範圍
<T extends Number> 約定T的型別為數值型別
Number 是short int double float long byte 的父類
5).Map
集合Map是單獨的集合,並不是Collection的子類集合,其常見的實現類有:
(1)HashMap
(2)LinkedHashMap
(3)TreeMap
(4)Hashtable
(5)Properties 繼承自Hashtable, 鍵值對為String,大多用於配置檔案的存取
Map:元素有key(鍵)和value(值),其中的鍵(key)不能重複,而值可以重複
map內的鍵-值對儲存是無序的,沒有下標的
-------------------------------------------------------------------------------------------------------------
HashMap:
常見方法:①put(Object K,Object V)②remove(key)刪除key鍵的鍵值對③size()④get(key)⑤containsKey(Object Key)是否包含key⑥containsValue(Object Value)是否包含值⑦values()獲取所有的值⑧KeySet()獲取所有的鍵
遍歷方法:
Map<T, T> map = new HashMap<>();
(1)對鍵(key)遍歷
a) for(T t : map.KeySet() ){} //獲取的key集合給o引用
b) Set<T> set = map.KeySet(); //用set集合實現,可以通過鍵找到值
for(T t:set ){}
(2)對值(value)遍歷
a) for(T t : map.ValueSet() ){} //對值進行遍歷
b) Collection<T> c = map.values(); //通過collection集合實現(值因為可能有重複),通過值無法找到鍵
for(T t: c){}
(3)對鍵-值(key, value)對遍歷
Set<Map.Entry<K, V>> set = map.entrySet();
for(Map.Entry<K, V> me : set){}
注: //Map.Entry<T, T>是一個類型別 ,它有兩個重要的方法:getKey() / getValue(); //獲取建和值
6).瞭解內容
(1)HashMap jdk1.2 底層是散列表 執行緒不安全,輕量級實現,允許null鍵-值對
(2)LinkedHashMap jdk1.2 散列表+連結串列 保證鍵-值對的遍歷時順序和新增時順序一致
(3)TreeMap jdk1.2 紅黑樹 可以根據key的內容對鍵值對進行自動升序排序
(4)Hashtable jdk1.0 底層是散列表 執行緒安全,重量級實現,鍵和值都不能為null
(5)Properties jdk1.0 Hashtable子類 鍵-值對都是String,專門用於讀取配置檔案的資訊