Java集合从菜鸟到大神演变
轉(zhuǎn)載自?Java集合從菜鳥(niǎo)到大神演變
先來(lái)看一張集合概況圖,這里從上到下列舉了幾個(gè)最經(jīng)常用的集合
1、集合接口
java.util.Collection 是一個(gè)集合接口。它提供了對(duì)集合對(duì)象進(jìn)行基本操作的通用接口方法。Collection接口在Java 類庫(kù)中有很多具體的實(shí)現(xiàn)。Collection接口的意義是為各種具體的集合提供了最大化的統(tǒng)一操作方式。聲明了適用于JAVA集合(只包括Set和List)的通用方法。Set 和List 都繼承了Conllection,Map沒(méi)有.
2、集合類型
JAVA集合主要分為三種類型:Set(集),List(列表),Map(映射)
Set集合:集合元素是不能重復(fù)的,元素是沒(méi)有順序的,所以它不能基于位置訪問(wèn)元素。
List集合: 集合元素是可以重復(fù)的,元素是有順序的,所以它可以基于位置訪問(wèn)元素。
Map:它包含鍵值對(duì)。Map的鍵是不能重復(fù)的,可以保證元素的插入順序,也可以排序。
3、集合介紹
Set(集):
HashSet
HashSet是基于HashMap實(shí)現(xiàn)的,它不允許出現(xiàn)重復(fù)元素,不保證和政集合中元素的順序,允許包含值為null的元素,但最多只能有一個(gè)null元素。
TreeSet
TreeSet可以實(shí)現(xiàn)排序等功能的集合,它在講對(duì)象元素添加到集合中時(shí)會(huì)自動(dòng)按照某種比較規(guī)則將其插入到有序的對(duì)象序列中,并保證該集合元素按照“升序”排列。
LinkedHashSet
具有HashSet的查詢速度,且內(nèi)部使用鏈表維護(hù)元素的順序(插入的次序),于是在使用迭代器遍歷Set時(shí),結(jié)果會(huì)按元素插入的次序顯示。
List(列表):
ArrayList
內(nèi)部結(jié)構(gòu)基于數(shù)組實(shí)現(xiàn),可以對(duì)元素進(jìn)行隨機(jī)的訪問(wèn),向ArrayList中插入與刪除元素的速度慢。
LinkedList
LinkedList 是一個(gè)繼承于AbstractSequentialList的雙向鏈表,可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作。LinkedList同時(shí)還實(shí)現(xiàn)了List、Deque(雙端隊(duì)列)、Cloneable(能克隆)、java.io.Serializable(支持序列化,能通過(guò)序列化去傳輸)等接口,LinkedList是非同步的。
每個(gè)節(jié)點(diǎn)除含有元素外,還包含向前,向后的指針。?
新建一個(gè)LinkedList,生成一個(gè)頭節(jié)點(diǎn)(header,就是一個(gè)頭指針),它的元素為null。?
它自包含,next和previous指針都指向自己。?執(zhí)行add(Object obj)方法后,會(huì)生成一個(gè)新節(jié)點(diǎn)?
?
Header節(jié)點(diǎn)的next指向鏈表的第一個(gè)節(jié)點(diǎn),previous指向鏈表的最后一個(gè)節(jié)點(diǎn),在這里都是first,再增加一個(gè)對(duì)象,它的形狀像下面這樣。?
Vector
Vector 是矢量隊(duì)列,它是JDK1.0版本添加的類。繼承于AbstractList,實(shí)現(xiàn)了List(支持相關(guān)的添加、刪除、修改、遍歷等), RandomAccess(隨機(jī)訪問(wèn)功能), Cloneable(能被克隆)這些接口。
Vector實(shí)際上是通過(guò)一個(gè)數(shù)組去保存數(shù)據(jù)的。當(dāng)我們構(gòu)造Vecotr時(shí);若使用默認(rèn)構(gòu)造函數(shù),則Vector的默認(rèn)容量大小是10。
當(dāng)Vector容量不足以容納全部元素時(shí),Vector的容量會(huì)增加。若容量增加系數(shù) >0,則將容量的值增加“容量增加系數(shù)”;否則,將容量大小增加一倍。Vector的克隆函數(shù),即是將全部元素克隆到一個(gè)數(shù)組中。和ArrayList不同,Vector中的操作是線程安全的。
Stack
Stack是棧,它的特性是:先進(jìn)后出(FILO, First In Last Out)。
Stack繼承于Vector(矢量隊(duì)列)的,由于Vector是通過(guò)數(shù)組實(shí)現(xiàn)的,這就意味著,Stack也是通過(guò)數(shù)組實(shí)現(xiàn)的,而非鏈表。
Map(映射):
Map基于散列表的實(shí)現(xiàn),Map 是一種把鍵對(duì)象和值對(duì)象映射的集合,它的每一個(gè)元素都包含一對(duì)鍵對(duì)象和值對(duì)象。
HashMap
HashMap底層就是一個(gè)數(shù)組結(jié)構(gòu)(叫做Entry Table),數(shù)組中的每一項(xiàng)又是一個(gè)鏈表(叫做Bucket,用于解決hash沖突而設(shè)計(jì)的)。當(dāng)新建一個(gè)HashMap的時(shí)候,就會(huì)初始化一個(gè)數(shù)組。插入和查詢“鍵值對(duì)”的開(kāi)銷是固定的,可以通過(guò)構(gòu)造器設(shè)置容量capacity和負(fù)載因子load factor,以調(diào)整容器的性能。初始化結(jié)構(gòu)如下:
每個(gè)bucket包含一個(gè)Entry(map自定義的一種結(jié)構(gòu),包含一個(gè)往后的指針)的鏈表。?
在put(key, value)后,它的結(jié)構(gòu)如下:
LinkedHashMap
類似于HashMap,但是迭代遍歷它時(shí),取得“鍵值對(duì)”的順序是其插入次序,或者是最近最少使用(LRU)的次序,只比HashMap慢一點(diǎn)。而在迭代訪問(wèn)時(shí)發(fā)而更快,因?yàn)樗褂面湵砭S護(hù)內(nèi)部次序。
TreeMap
基于紅黑樹(shù)數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn),查看“鍵”或“鍵值對(duì)”時(shí),它們會(huì)被排序(次序由Comparabel或Comparator決定)。TreeMap的特點(diǎn)在于,你得到的結(jié)果是經(jīng)過(guò)排序的。TreeMap是唯一的帶有subMap()方法的Map,它可以返回一個(gè)子樹(shù)。
WeakHashMap
弱鍵(weak key)Map,Map中使用的對(duì)象也被允許釋放: 這是為解決特殊問(wèn)題設(shè)計(jì)的。如果沒(méi)有map之外的引用指向某個(gè)“鍵”,則此“鍵”可以被垃圾收集器回收。
IdentifyHashMap
使用==代替equals()對(duì)“鍵”作比較的hash map,專為解決特殊問(wèn)題而設(shè)計(jì)。
Hashtable
Hashtable與HashMap類似,Hashtable繼承自Dictionary類,實(shí)現(xiàn)了Map接口,不同的是它不允許記錄的鍵或者值為空;和HashMap相比,Hashtable是線程同步的,即任一時(shí)刻只有一個(gè)線程能寫Hashtable,因此也導(dǎo)致了 Hashtable在寫入時(shí)會(huì)比較慢。而且Hashtable可以通過(guò)Enumeration去遍歷。
?
? ? ? ??
4、總結(jié)
List按對(duì)象進(jìn)入的順序保存對(duì)象,不做排序或編輯操作。
Set對(duì)每個(gè)對(duì)象只接受一次,并使用自己內(nèi)部的排序方法(通常,你只關(guān)心某個(gè)元素是否屬于Set,而不關(guān)心它的順序--否則應(yīng)該使用List)。
Map同樣對(duì)每個(gè)元素保存一份,但這是基于"鍵"的,Map也有內(nèi)置的排序,因而不關(guān)心元素添加的順序。
如果添加元素的順序?qū)δ愫苤匾?#xff0c;應(yīng)該使用 LinkedHashSet/TreeSet或者LinkedHashMap/TreeMap.
最后還要提到集合類里面一個(gè)很重要的類:Collections,它有很多自己獨(dú)特的靜態(tài)方法。當(dāng)然它主要提供幾種特殊集合(List, Map,Set),可以調(diào)用靜態(tài)方法來(lái)獲得:Unmodifiable*(不可修改集合,不可添加或刪除元素),Synchronize*(保持同步集合,它的基本每個(gè)方法都加鎖,防止并發(fā)操作),Checked*(聲明之始傳入特定類型,以后的操作都會(huì)驗(yàn)證加入元素是否屬于已定類型),Singleton*(集合中只包含一個(gè)元素)。它們都是通過(guò)包裝集合類中的抽象類獲得,產(chǎn)生不同的行為。?
總結(jié)
以上是生活随笔為你收集整理的Java集合从菜鸟到大神演变的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Java码农必须掌握的循环删除List元
- 下一篇: 重庆怎么申请400电话(重庆400电话如