1. 程式人生 > 實用技巧 >【Java】Java中的集合框架、泛型

【Java】Java中的集合框架、泛型

集合框架、泛型

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,專門用於讀取配置檔案的資訊