JAVA后端架構(gòu)—《集合體系》

1. Collection

最基本的集合接口
一個(gè)Collection代表一組Object的集合

public interface Collection<E> extends Iterable<E>
java.util.Collection的子接口包括: 
java.util.Set 
    java.util.SortedSet 
    java.util.NavigableSet 
java.util.Queue 
    java.util.concurrent.BlockingQueue 
    java.util.concurrent.TransferQueue 
java.util.Deque 
    java.util.concurrent.BlockingDeque

任何實(shí)現(xiàn)Collection接口的類柱嫌,都必須實(shí)現(xiàn)iterator方法來(lái)提供遍歷集合中的元素

Iterator<T> iterator();

例如List中集合的遍歷可以采用如下方式

List<String> stringList = Arrays.asList(array);
Iterator<String> iterator = stringList.iterator();
while(iterator.hasNext()){
    System.out.printf(iterator.next());
}

值得注意的是,Collection和Collectors的區(qū)別调卑,Collection是集合的接口,所有的集合類都實(shí)現(xiàn)該接口巾陕;Collectors是一個(gè)類童社,提供了sort方法對(duì)集合進(jìn)行排序溯警。

1.1.List

List代表元素有序,可重復(fù)的集合年柠,集合中每個(gè)元素都有對(duì)應(yīng)的順序索引凿歼,允許加入重復(fù)元素,通過(guò)索引指定元素的位置冗恨,實(shí)現(xiàn)有ArrayList,Vector,Queue答憔。

1.1.1 ArrayList

ArrayList是基于數(shù)組的實(shí)現(xiàn),封裝了一個(gè)動(dòng)態(tài)增長(zhǎng)掀抹,允許再分配的Object[]數(shù)組虐拓。

1.1.2 Vector
public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

使用方法和ArrayList基本相同,子類有Stack傲武。和ArrayList區(qū)別是Vector是線程安全的蓉驹,對(duì)集合元素操作的時(shí)候都加了Synchronized,保證線程的安全揪利;在擴(kuò)容時(shí)态兴,Vector默認(rèn)增長(zhǎng)一倍的容量,而List只增長(zhǎng)50%;

1.1.2.1 Stack

stack(棧)實(shí)現(xiàn)了Vector類疟位,后進(jìn)先出瞻润。

1.1.3 LinkedList
public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable

實(shí)現(xiàn)List接口,Deque接口甜刻;基于鏈?zhǔn)降拇鎯?chǔ)方式

1.2 Queue

queue用于模擬隊(duì)列這種數(shù)據(jù)結(jié)構(gòu)绍撞,先進(jìn)先出。

1.2.1PriorityQueue

最大堆得院,最小堆傻铣,基于數(shù)據(jù)的完全二叉樹(shù)實(shí)現(xiàn)

1.2.2 Deque

1.2.2.1 LinkedList

實(shí)現(xiàn)了List和Deque(雙端隊(duì)列Deque繼承了Queue接口)兩個(gè)接口。它可以作為L(zhǎng)ist和Queue使用祥绞,也可以作為棧進(jìn)行使用矾柜。

1.3 Set

Set繼承Collection接口阱驾,不能包含重復(fù)元素就谜,Set判斷兩個(gè)對(duì)象不是使用==來(lái)判斷怪蔑,是使用equals方法,新加入的元素會(huì)與已有的元素判斷equals比較返回false則加入丧荐,否則拒絕加入缆瓣;所以使用Set的時(shí)候有兩點(diǎn)需要注意:1.放入的對(duì)象要實(shí)現(xiàn)equals方法;2.對(duì)set的構(gòu)造函數(shù)中虹统,傳入的Collection參數(shù)不能包含重復(fù)的元素弓坞。

1.3.1 HashSet

HashSet實(shí)現(xiàn)了Set接口,由哈希表提供支持车荔,不保證Set的迭代順序渡冻;允許使用null值,同時(shí)不允許元素有重復(fù)忧便,因?yàn)镠ashSet底層是使用HashMap來(lái)實(shí)現(xiàn)的族吻,HashSet中的元素都存放在HashMap的key上面,value是一個(gè)統(tǒng)一的靜態(tài)變量珠增;

HashSet中添加元素調(diào)用add方法超歌,然后會(huì)調(diào)用HashMap的put方法插入元素,HashMap的put方法插入元素時(shí)蒂教,會(huì)首先判斷是否存在key巍举,如果不存在,則插入這個(gè)key-value,存在則修改value值凝垛;在set中懊悯,value值沒(méi)用,因此往HashSet中添加元素梦皮,首先判斷key是否存在炭分,不存在插入元素,存在則不做處理届氢;
HashSet使用Hash算法存儲(chǔ)集合中的元素欠窒,具有很好的查找和存取性能。向HashSet中存入一個(gè)元素時(shí)退子,HashSet調(diào)用對(duì)象的HashCode方法獲取對(duì)象的HashCode值岖妄,根據(jù)HashCode值決定對(duì)象的存儲(chǔ)位置。HashSet判斷元素對(duì)象是否相同的方法是同時(shí)使用HashCode和equals方法來(lái)判斷寂祥,關(guān)于equals方法和HashCode的說(shuō)明:

1.equals相等的對(duì)象荐虐,hashCode一定相等;

2.equals不相等的對(duì)象丸凭,hashCode可能相等福扬,也可能相等腕铸。(哈希生成的時(shí)候產(chǎn)生碰撞)

3.反之,HashCode不相等铛碑,則equals方法一定不相等(如果equals相等則與規(guī)則1矛盾)狠裹;

4.HashCode相等,equals可以相等汽烦,也可以不相等涛菠。

HashSet判斷元素相等方法時(shí),首先判斷兩個(gè)對(duì)象的HashCode是否相等撇吞,如果不相等俗冻,則認(rèn)為兩個(gè)對(duì)象也不相等,如果相等再判斷equals方法是否相等牍颈;如果hashCode相等迄薄,equals方法不相等,則認(rèn)為時(shí)不同的對(duì)象煮岁;為什么這樣做讥蔽,主要是為了提高效率,HashCode的效率比equals效率更高人乓,不必每次重新計(jì)算Hash值.

1.3.1.1 linkedHashSet

linkedHashSet繼承自HashSet勤篮,同時(shí)使用鏈表來(lái)維護(hù)元素的順序,元素以插入的順序進(jìn)行訪問(wèn)色罚;在性能上略低于HashSet,但在迭代訪問(wèn)時(shí)有很好的性能碰缔;

1.3.2 SortedSet

主要用于排序操作,實(shí)現(xiàn)此接口的子類都屬于排序子類戳护。

1.3.2.1 TreeSet

基于SortedSet金抡,底層實(shí)現(xiàn)是通過(guò)二叉樹(shù),插入的元素要實(shí)現(xiàn)Comparable接口腌且。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梗肝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子铺董,更是在濱河造成了極大的恐慌巫击,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件精续,死亡現(xiàn)場(chǎng)離奇詭異坝锰,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)重付,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門顷级,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人确垫,你說(shuō)我怎么就攤上這事弓颈∶毖浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵翔冀,是天一觀的道長(zhǎng)导街。 經(jīng)常有香客問(wèn)我,道長(zhǎng)橘蜜,這世上最難降的妖魔是什么菊匿? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮计福,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘徽职。我一直安慰自己象颖,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布姆钉。 她就那樣靜靜地躺著说订,像睡著了一般。 火紅的嫁衣襯著肌膚如雪潮瓶。 梳的紋絲不亂的頭發(fā)上陶冷,一...
    開(kāi)封第一講書(shū)人閱讀 51,554評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音毯辅,去河邊找鬼埂伦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛思恐,可吹牛的內(nèi)容都是我干的沾谜。 我是一名探鬼主播,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼胀莹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼基跑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起描焰,我...
    開(kāi)封第一講書(shū)人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤媳否,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后荆秦,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體篱竭,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年萄凤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了室抽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡靡努,死狀恐怖坪圾,靈堂內(nèi)的尸體忽然破棺而出晓折,到底是詐尸還是另有隱情,我是刑警寧澤兽泄,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布漓概,位于F島的核電站,受9級(jí)特大地震影響病梢,放射性物質(zhì)發(fā)生泄漏胃珍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一蜓陌、第九天 我趴在偏房一處隱蔽的房頂上張望觅彰。 院中可真熱鬧,春花似錦钮热、人聲如沸填抬。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)飒责。三九已至,卻和暖如春仆潮,著一層夾襖步出監(jiān)牢的瞬間宏蛉,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人奖唯。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像辟灰,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子篡石,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Java集合類可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)如棧,隊(duì)列等,Java集合還可以用于保存具有映射關(guān)...
    小徐andorid閱讀 1,942評(píng)論 0 13
  • 四芥喇、集合框架 1:String類:字符串(重點(diǎn)) (1)多個(gè)字符組成的一個(gè)序列,叫字符串凰萨。生活中很多數(shù)據(jù)的描述都采...
    佘大將軍閱讀 753評(píng)論 0 2
  • Collection ├List │├LinkedList │├ArrayList │└Vector │└Stac...
    AndyZX閱讀 875評(píng)論 0 1
  • 集合類框架的介紹: ![Java 集合類框架](https://upload-images.jianshu.io/...
    LynnGuo閱讀 754評(píng)論 0 1
  • 在編程中继控,常常需要集中存放多個(gè)數(shù)據(jù)。集合類主要負(fù)責(zé)保存胖眷、盛裝其他數(shù)據(jù)武通,因此集合類也被稱為容器類。所有的集合類都位于...
    一一一二二三閱讀 408評(píng)論 0 1