Java一些八卦集合类
Map 和 Set關(guān)系
Map和Set事實(shí)基礎(chǔ)的朋友,有著千絲萬縷的聯(lián)系。
Map它可以被看作是Set延期。從何時(shí)起Set內(nèi)容存儲(chǔ)在key-value的值當(dāng)表單。這個(gè)Set實(shí)際上可以作為Map使用。反過來,Map事實(shí)上,有一個(gè)Map.Entry內(nèi)部接口。而Map在存放值對時(shí),全然不考慮value,而僅僅考慮key,因此Map也能夠看成是一個(gè)存key的Set,而value僅僅是key的附屬物。
HashMap加入元素時(shí),依據(jù)key的hashCode進(jìn)行再哈希計(jì)算得到值來決定存放位置。HashMap底層有個(gè)數(shù)組Entry[],依據(jù)hash值來決定key-value存在數(shù)組的哪個(gè)元素,而Entry[]實(shí)際上是一個(gè)table。
HashSet底層是居于HashMap來實(shí)現(xiàn)的。HashSet底層用HashMap來保存全部元素,這些元素作為HashMap的key,而相應(yīng)的Value是一個(gè)名為PRESENT的static final的Object對象。對HashSet操作的方法都調(diào)用HashMap的方法進(jìn)行操作。
元素是否反復(fù),要同一時(shí)候推斷元素對象的hashCode()和equals(),hashCode相等且equals返還true時(shí)才覺得是反復(fù)元素,不進(jìn)行替換。
TreeSet和TreeMap的關(guān)系也是非常相似的,即TreeSet底層是採用TreeMap存儲(chǔ)的。TreeMap採用紅黑樹的排序二叉樹來保存Map中的每一個(gè)Entry(樹節(jié)點(diǎn))。
?
List的三個(gè)實(shí)現(xiàn):ArrayList,Vector和LinkedList。
Vector還有個(gè)兒子Stack,Stack不過在Vector的基礎(chǔ)上加入了5個(gè)方法,只五個(gè)方法的代碼就將Vector變成了Stack,Stack依舊是一個(gè)Vector,它繼承了Vector的synchronized血統(tǒng),都是線程安全的。從JDK1.6開始,Java提供了Deque接口并提供了實(shí)現(xiàn)類ArrayDeque,即使程序中須要棧這種數(shù)據(jù)結(jié)構(gòu),也不推薦使用Stack而推薦使用Deque。除非要求線程安全。
Deque是雙端隊(duì)列。是隊(duì)列但同一時(shí)候擁有棧的功能。底層都是數(shù)組實(shí)現(xiàn)。
Vector差點(diǎn)兒被ArrayList取代了,它唯一的優(yōu)點(diǎn)是線程安全。
如今甚至為了線程安全也不用Vector了。能夠通過Collections工具類的synchronizedList()方法將一個(gè)普通的ArrayList包裝成線程安全的ArrayList。
?
ArrayList 和LinkedList
ArrayList底層是基于數(shù)組實(shí)現(xiàn)的。所以ArrayList創(chuàng)建的時(shí)候有個(gè)初始的capacity,提供了構(gòu)造方法,編程者能夠在創(chuàng)建ArrayList時(shí)指定初始的capacity。假設(shè)沒有顯式提供capacity,那么程序默認(rèn)設(shè)置為10.LinkedList是雙向列表存儲(chǔ)結(jié)構(gòu),不僅實(shí)現(xiàn)List接口,還實(shí)現(xiàn)Deque雙端隊(duì)列接口。
版權(quán)聲明:本文博客原創(chuàng)文章,博客,未經(jīng)同意,不得轉(zhuǎn)載。
總結(jié)
以上是生活随笔為你收集整理的Java一些八卦集合类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: css3中实现2d旋转的函数是什么
- 下一篇: Javascript异步编程之一异步原理