集合框架--集合框架體系概述
集合框架--集合框架體系概述
原地址:https://blog.csdn.net/wabiaozia/article/details/53791366
集合框架體系主要如上圖所示,集合類主要分為兩大類:Collection和Map。
先簡單概述幾個相關問題。
1、先說明下什麼是集合?
當資料多了需要儲存,需要容器,但是資料的個數又不確定的時候,無法使用陣列(陣列長度是固定的,集合長度是可變的),這時便使用了Java中的另一個容器--集合。
2、陣列與集合有哪些不同?
陣列中儲存的是同一型別的元素,可以儲存基本資料型別值。
集合儲存的是物件,而且物件的型別可以不一致。
3、什麼時候使用集合呢?
當物件多的時候,先進行儲存。
在實際的使用中,我們有了更多的需求,於是出現了集合框架,有了更多的容器(每個容器有自己的資料結構,因此其功能也不同),在不斷向上抽取的過程中,出現了體系,最終形成了集合框架.
細節:1 集合中儲存的都是物件的地址(引用)
2 集合中是否可以儲存基本數值?不可以,但在jdk1.5後可以這麼寫,但是儲存的還是物件(基本資料型別包裝類物件)
3 儲存的時候自動提升為Object型別,取出的時候如果需要使用元素的特有內容,必須進行向下轉型
接下來,簡單談談Collection,collection是List、Set等集合高度抽象出來的介面,它包含了這些集合的基本操作。主要分為:List和Set。
一、List介面:
通常表示一個列表(陣列、佇列、連結串列、棧等),有序的,
元素是可以重複的,通過索引就可以精確的操作集合中的元素,List介面的特有方法,都是圍繞索引定義的。
List獲取元素的方式有兩種:一種是迭代,還有一種是遍歷+get
List介面是支援對元素進行增刪改查動作的(add,set,get,remove)
常用的實現類為ArrayList和LinkedList,還有不常用的Vector(已過時)。
1、ArrayList:是陣列結構,長度是可變的,原理是(建立新陣列+複製陣列),查詢速度快,增刪較慢,不同步。ArrayList不是執行緒安全的,只能用在單執行緒環境下,多執行緒環境下可以考慮使用Collections.synchronizedList(List i)函式返回一個執行緒安全的ArrayList類,或者使用Concurrent併發包下對應的集合類。
2、LinkedList:是基於雙向迴圈連結串列實現的,是連結串列結構,不同步的,增刪速度快,查詢較慢。由於實現了Queue介面,因此也可以用於實現堆疊、佇列。
3、Vector:可以增長的陣列結構,同步的,效率很低,查詢增刪湊慢,已過時。
二、Set集合:不允許包含重複的元素(通過hashcode和equals函式保證),不保證順序,而且方法和Collection一致,set集合取出元素的方式只有一種:迭代器。
常用的實現類為HashSet和TreeSet。
1、HashSet:基於HashMap實現,雜湊表結構,不同步,保證元素的唯一性依賴於hashCode(),equals()方法。
Hash概述:雜湊演算法hash也稱雜湊,結果叫雜湊值。陣列中儲存的都是(元素與雜湊值的)對應關係,該陣列稱為雜湊表,查詢速度比陣列快,重複元素存不進去,保證元素的唯一性。
雜湊衝突怎麼解決?元素的雜湊值(hashcode())一致了,這是會再次判斷元素的內容是否相同(equals()),如果equlas返回true,意味著兩個元素相同,如果返回的是false,意味著兩個元素不相同,繼續通過演算法算出位置進行儲存(拉鍊法)。
2、TreeSet:基於TreeMap實現,實現了SortedSet介面,是有序的,新增到TreeSet中的元素要實現Comparable介面,以便使用元素的自然排序對元素進行排序,或者根據建立set時提供的Comparator進行排序。
comparable和comparator的區別:
Comparable:此介面強行對實現它的每個類的物件進行整體排序。這種排序被稱為類的自然排序,類的 compareTo 方法被稱為它的自然比較方法。
他們都是用來實現集合中元素的比較、排序的,只是comparable是在集合內部定義的方法實現的排序,而comparator是在集合外部實現的排序。
comparator位於包java.util下,而comparable位於包java.lang下。
元素的排序比較有兩種方式:
a,元素自身具備的自然排序,其實就是實現了Comparable介面,重寫了compareTo方法。如果元素自身不具備自然排序,或者具備的自然排序不是所需要的,這時使用第二種方式。
b,比較器排序,其實就是在建立TreeSet集合時,在建構函式中指定具體的比較方式,需要定義一個類實現Comparator介面,重寫compare方法。
到此為止,在往集合中儲存物件時,通常該物件都需要覆蓋hashcode(),equals(),同時實現Comparable介面,建立物件的自然排序。
·
三、Map:抽象類AbstractMap通過介面卡模式實現了Map介面中大部分的函式,TreeMap、HashMap等實現類都是通過繼承AbstractMap來實現,另外,不常用的HashTable直接實現了Map介面,他和Vector都是JDK1.0就引入的集合類。
1、內部儲存的都是key-value鍵值對
2、必須保證鍵的唯一性,value可以有多個相同的
Map
|--Hashtable:資料結構為雜湊表,同步的,不允許null作為鍵和值,被hashmap所替代
|--Properties:屬性集,鍵和值都是字串,可結合流進行鍵值的操作
|--HashMap:資料結構為雜湊表,不同步,允許null作為鍵和值,無序的
|--TreeMap:資料結構是二叉樹,不同步,可對map集合中給的鍵進行排序
四、Iterator:是遍歷集合的迭代器(不能遍歷Map,只能遍歷Collection),Collection的實現類都實現了iterator()函式,它返回一個Iterator物件,用來遍歷集合,ListIterator則專門用來遍歷List。其中,列舉Emumeration和迭代器Iterator功能重複,Iterator多一個刪除操作,由於其名字太長,被棄用。
五、Arrays和Collections
Collections:集合框架中用於操作集合物件的工具類,都是靜態方法。
1、獲取Collection最值
2、對List集合排序,也可以二分查詢
3、對排序逆序
4、可以將非同步的集合轉成同步的集合
Arrays:用於運算元組的工具類,類中定義的都是靜態工具方法。
1、對陣列排序
2、二分查詢
3、陣列複製
4、將兩個陣列進行元素的比較,判斷兩個陣列是否相同
5、將陣列轉成字串
6、將陣列轉成list集合(asList方法),為了使用集合的方法運算元組中的元素
注意:陣列長度是固定的,在轉成集合後,長度也是固定的,所以不要使用集合的增刪功能;如果陣列中儲存的是基本資料型別,那麼轉成集合後,陣列物件作為集合中的元素存在;如果陣列中元素是引用資料型別時,轉成集合後,陣列元素作為集合元素存在。