這篇文章主要為大家展示了“java.util.Collection源碼的示例分析”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“java.util.Collection源碼的示例分析”這篇文章吧。
成都創(chuàng)新互聯(lián)公司憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢(shì),提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十載的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千家中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
明確一下幾點(diǎn):
Collection是接口,其繼承了Iterable接口
Collection屬于單值類型集合,重點(diǎn)子接口List接口和Set接口
Java.util.List接口(有序、不唯一)
ArraryList
ArrayList 是一個(gè)數(shù)組隊(duì)列,相當(dāng)于 動(dòng)態(tài)數(shù)組。與Java中的數(shù)組相比,它的容量能動(dòng)態(tài)增長(zhǎng)。它繼承于AbstractList,實(shí)現(xiàn)了List, RandomAccess, Cloneable, java.io.Serializable這些接口。ArrayList是非同步的,效率高但是線程不安全,Collections.sychromiziedList(new ArraryList<>());
可以讓那個(gè)ArrayList變成線程安全類
ArrayList是基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,在增刪時(shí)候,需要數(shù)組的拷貝復(fù)制。
ArrayList的默認(rèn)初始化容量是10,每次擴(kuò)容時(shí)候增加原先容量的一半,也就是變?yōu)樵瓉淼?.5倍
刪除元素時(shí)不會(huì)減少容量,若希望減少容量則調(diào)用trimToSize()
它不是線程安全的。它能存放null值。
LinkedList
LinkedList是一個(gè)雙向循環(huán)列表隊(duì)列
LinkedList 是一個(gè)繼承于AbstractSequentialList的雙向鏈表。它也可以被當(dāng)作堆棧、隊(duì)列或雙端隊(duì)列進(jìn)行操作。
LinkedList 實(shí)現(xiàn) List 接口,能對(duì)它進(jìn)行隊(duì)列操作。
LinkedList 實(shí)現(xiàn) Deque 接口,即能將LinkedList當(dāng)作雙端隊(duì)列使用。
LinkedList 實(shí)現(xiàn)了Cloneable接口,即覆蓋了函數(shù)clone()
,能克隆。
LinkedList 實(shí)現(xiàn)java.io.Serializable
接口,這意味著LinkedList支持序列化,能通過序列化去傳輸。
LinkedList 是非同步的。
Vector
底層是數(shù)組,現(xiàn)在已少用,被ArrayList替代,原因有兩個(gè):
Vector所有方法都是同步,有性能損失。
Vector初始length是10 超過length時(shí) 以100%比率增長(zhǎng),相比于ArrayList更多消耗內(nèi)存。
參考資料:https://www.zhihu.com/question/31948523/answer/113357347
總的來說:查詢多用ArrayList,增刪多用LinkedList。
ArrayList增刪慢不是絕對(duì)的(在數(shù)量大的情況下,會(huì)有例外):
如果增加元素一直是使用add()
(增加到末尾)的話,并且不擴(kuò)容的情況下)
一直刪除末尾的元素也是ArrayList要快【不用復(fù)制移動(dòng)位置】
至于如果刪除的是中間的位置的話,還是ArrayList要快!
但一般來說:增刪多還是用LinkedList,因?yàn)樯厦娴那闆r是極端的~
Java.util.Set接口(無序、唯一)
|——SortedSet接口——TreeSet實(shí)現(xiàn)類
Set接口——|——HashSet實(shí)現(xiàn)類
|——LinkedHashSet實(shí)現(xiàn)類
hashSet
hashSet底層基于hashMap實(shí)現(xiàn),如圖
hashSet中的add()方法,是將對(duì)象E放入hashMap中的key的位置,value位置存放的是一個(gè)固定的Object,如圖:
HashSet是無序唯一的,當(dāng)元素為自定義對(duì)象時(shí),兩者的hashCode不同,被認(rèn)為是不同的元素從而被允許放入HashSet中,但這不符合實(shí)際的生產(chǎn)意義,因此需要讓其判定位相等,就要重寫hashCode()
,然而重寫HashCode()
,會(huì)出現(xiàn)重碼的bug,因此需要重寫equals()
來解決
添加元素的時(shí)候,如果key(也對(duì)應(yīng)的Set集合的元素)相等,那么則修改value值。而在Set集合中,value值僅僅是一個(gè)Object對(duì)象罷了(該對(duì)象對(duì)Set本身而言是無用的)。
也就是說:Set集合如果添加的元素相同時(shí),是根本沒有插入的(僅修改了一個(gè)無用的value值),從源碼(HashMap)中也看出來,==和equals()
方法都有使用,具體過程如下
新元素的hsah是否等于老元素的hash,如果不相等,則元素不同,如果相等,那么進(jìn)行第二部比較
新元素與老元素用“==”進(jìn)行比較,如果相等,則為同一元素,若不同則進(jìn)行第三部比較
新元素和老元素用equals()
方法判定是否相等,如果不等則不是同一元素,如果相等那么結(jié)果為:兩個(gè)元素不是同一個(gè)對(duì)象,程序想把它們當(dāng)成同一個(gè)對(duì)象,因此重寫了equals方法;
TreeSet
與HashSet是基于HashMap實(shí)現(xiàn)一樣,TreeSet同樣是基于TreeMap實(shí)現(xiàn)的。
TreeSet是SortedSet接口的唯一實(shí)現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序?yàn)槟J(rèn)的排序方式。向 TreeSet中加入的應(yīng)該是同一個(gè)類的對(duì)象。
LinkedHashSet
LinkedHashSet是HashSet的一個(gè)“擴(kuò)展版本”,HashSet并不管什么順序,不同的是LinkedHashSet會(huì)維護(hù)“插入順序”。HashSet內(nèi)部使用HashMap對(duì)象來存儲(chǔ)它的元素,而LinkedHashSet內(nèi)部使用LinkedHashMap對(duì)象來存儲(chǔ)和處理它的元素
以上是“java.util.Collection源碼的示例分析”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道!