Java集合

集合概述


?Java提供集合類,集合類主要負責保存死遭、盛裝其他數(shù)據(jù)凯旋,因此集合類也被稱為容器類。所有集合類都位于java.util包下钠署。

?Java的集合類主要由兩個接口派生而出:Collection和Map荒椭,Collection和Map是Java集合框架的根接口,這兩個接口又包含了一些子接口或?qū)崿F(xiàn)類戳杀。


Collection集合



?Collection接口是List信卡、Set和Queue接口的父接口,該接口里定義的方法既可用于操作Set集合傍菇,也可用于操作List和Queue集合。 ? ? ? ? ? ? ? ? ??Collection提供了大量添加牵触、刪除淮悼、訪問的方法來訪問集合元素袜腥。


Iterator接口


?Iterator接口也是Java集合框架的成員钉汗,但它與Collection系列、Map系列的集合不一樣:Collection系列集合福侈、Map系列集合主要用于盛裝其他對象卢未,而Iterator則主要用于遍歷(即迭代訪問)Collection集合中的元素,Iterator對象也被稱為迭代器辽社。

?Iterator接口里定義了如下4個方法:

–boolean hasNext():如果被迭代的集合還元素沒有被遍歷爹袁,則返回true矮固。

–Object next():返回集合里下一個元素失息。

–void remove()?:刪除集合里上一次next方法返回的元素

–void forEachRemaining(Consumer action)盹兢,這是Java 8為Iterator新增的默認方法守伸,該方法可使用Lambda表達式來遍歷集合元素。

?使用JDK1.5提供的foreach循環(huán)來迭代訪問集合元素更加便捷尼摹。

?當使用foreach循環(huán)迭代訪問集合元素時蠢涝,該集合也不能被改變,否則將引發(fā)ConcurrentModificationException異常和二。

?Java8為Collection集合新增了一些需要Predicate參數(shù)的方法,這些方法可以對集合元素進行過濾惕它。程序可使用Lambda表達式構(gòu)建Predicate對象。

Java8新增的Stream操作


?Java 8還新增了Stream郁惜、IntStream揭北、LongStream、DoubleStream等流式API恨樟。

?獨立使用Stream的步驟如下:

–(1)使用Stream或XxxStream的builder()類方法創(chuàng)建該Stream對應(yīng)Builder疚俱。

–(2)重復調(diào)用Builder的add()方法向該流中添加多個元素。

–(3)調(diào)用Builder的build()方法獲取對應(yīng)的Stream呆奕。

–(4)調(diào)用Stream的聚集方法梁钾。

?Collection接口提供了一個stream()默認方法,該方法可返回該集合對應(yīng)的流姆泻,接下來即可通過流API來操作集合元素拇勃。由于Stream可以對集合元素進行整體的聚集操作,因此Stream極大了豐富了集合的功能方咆。

HashSet類


?HashSet是Set接口的典型實現(xiàn)瓣赂,大多時候使用Set集合時就是使用這個實現(xiàn)類。HashSet按Hash算法來存儲集合中的元素煌集,因此具有很好的存取和查找性能。

?當向HashSet集合中存入一個元素時职恳,HashSet會調(diào)用該對象的hashCode()方法來得到該對象的hashCode值,然后根據(jù)該HashCode值來決定該對象在HashSet中存儲位置色徘。如果有兩個元素通過equals方法比較返回true操禀,但它們的hashCode()方法返回值不相等,HashSet將會把它們存儲在不同位置斤寂,也就可以添加成功揪惦。

?不能保證元素的排列順序,順序可能與元素的添加順序不同器腋,元素的順序可能變化纫塌。

?HashSet不是同步的,如果多個線程同時訪問一個HashSet措左,如果有2條或者2條以上線程同時修改了HashSet集合時怎披,必須通過代碼來保證其同步。

?集合元素值可以是null钳枕。

?LinkedHashSet集合也是根據(jù)元素hashCode值來決定元素存儲位置鱼炒,但它同時使用鏈表維護元素的次序蝌借,這樣使得元素看起來是以插入的順序保存的。也就是說菩佑,當遍歷LinkedHashSet集合里元素時稍坯,HashSet將會按元素的添加順序來訪問集合里的元素搓劫。

?LinkedHashSet需要維護元素的插入順序混巧,因此性能略低于HashSet的性能,但在迭代訪問Set里的全部元素時將有很好的性能秘蛔,因為它以鏈表來維護內(nèi)部順序傍衡。

?TreeSet是SortedSet接口的唯一實現(xiàn),正如SortedSet名字所暗示的蛙埂,TreeSet可以確保集合元素處于排序狀態(tài)箱残。與前面HashSet集合相比,TreeSet還提供了如下幾個額外的方法:

–Object first():返回集合中的第一個元素被辑。

–Object last():返回集合中的最末一個元素盼理。

–Object lower(Object e):返回集合中位于指定元素之前的元素(即小于指定元素的最大元素,參考元素不需要是TreeSet的元素)奏路。

–Object higher(Object e):返回集合中位于指定元素之后的元素(即大于指定元素的最小元素臊诊,參考元素不需要是TreeSet的元素)。

–SortedSet subSet(fromElement, toElement):返回此Set的子集合触机,范圍從fromElement(包含)到toElement(不包含)玷或。

–SortedSet headSet(toElement):返回此Set的子集,由小于toElement的元素組成蔬胯。

–SortedSet tailSet(fromElement):返回此Set的子集位他,由大于或等于fromElement的元素組成产场。

?TreeSet采用紅黑樹的數(shù)據(jù)結(jié)構(gòu)對元素進行排序泼橘。TreeSet支持兩種排序方法:自然排序和定制排序。

–自然排序:TreeSet會調(diào)用集合元素的compareTo(Object obj)方法來比較元素之間大小關(guān)系醋粟,然后將集合元素按升序排列重归,這種方式就是自然排列。

–定制排序:TreeSet借助于Comparator接口的幫助育苟。該接口里包含一個的int compare(T o1, T o2)方法椎木,該方法用于比較o1和o2的大小。

?EnumSet是一個專為枚舉類設(shè)計的集合類漱竖,EnumSet中所有元素都必須是指定枚舉類型的枚舉值畜伐,該枚舉類型在創(chuàng)建EnumSet時顯式或隱式地指定。EnumSet的集合元素也是有序的万矾,EnumSet以枚舉值在Enum類的定義順序來決定集合元素的順序慎框。

?EnumSet在內(nèi)部以位向量的形式存儲,這種存儲形式非常緊湊薪丁、高效猎醇,因此EnumSet對象占用內(nèi)存很小努溃,而且運行效率很好梧税。尤其是當進行批量操作(如調(diào)用containsAll 和 retainAll方法)時称近,如其參數(shù)也是EnumSet集合哮塞,則該批量操作的執(zhí)行速度也非常快衡未。

?EnumSet集合不允許加入null元素缓醋。如果試圖插入null元素送粱,EnumSet將拋出 NullPointerException異常抗俄。如果僅僅只是試圖測試是否出現(xiàn)null元素动雹、或刪除null元素都不會拋出異常冯乘,只是刪除操作將返回false裆馒,因為沒有任何null元素被刪除喷好。

List接口


?List集合代表一個有序集合,集合中每個元素都有其對應(yīng)的順序索引禾唁。List集合允許使用重復元素无切,可以通過索引來訪問指定位置的集合元素哆键。因為List集合默認按元素的添加順序設(shè)置元素的索引籍嘹,例如第一次添加的元素索引為0,第二次添加的元素索引為1……

?List作為Collection接口的子接口听绳,當然可以使用Collection接口里全部方法椅挣。而且由于List是有序集合贴妻,因此List集合里包含了根據(jù)索引來操作集合元素的方法名惩。

?ListIterator與Iterator接口不同,它不僅可以向后迭代弯予,它還可以向前迭代锈嫩。

?ListIterator包含增加了如下3個方法:

–boolean hasPrevious():返回該迭代器關(guān)聯(lián)的集合是否還有上一個元素。

–Object previous():返回該迭代器的上一個元素猴贰。

–void add():在指定位置插入一個元素瑟捣。

Iterator(迭代)


?迭代是取出集合中元素的一種方式。

?因為Collection中有iterator方法碱鳞,所以每一個子類集合對象都具備迭代器芙扎。

用法:

for(Iterator iter =iterator();iter.hasNext();? )

{

? System.out.println(iter.next());

}

Iterator iter =l.iterator();

while(iter.hasNext())

{

? System.out.println(iter.next());

}

?迭代器在Collcection接口中是通用的。

?迭代器的next方法是自動向下取元素圈浇,要避免出現(xiàn)NoSuchElementException磷蜀。

?迭代器的next方法返回值類型是Object褐隆,所以要記得類型轉(zhuǎn)換。

key和value都可以是任何引用類型的數(shù)據(jù)。Map的key不允許重復屡穗,即同一個Map對象的任何兩個key通過equals方法比較總是返回false鸡捐。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末煎源,一起剝皮案震驚了整個濱河市手销,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖侥钳,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疫萤,居然都是意外死亡扯饶,警方通過查閱死者的電腦和手機帝际,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進店門弃揽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來矿微,“玉大人涌矢,你說我怎么就攤上這事娜庇∶悖” “怎么了继榆?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵略吨,是天一觀的道長鞠苟。 經(jīng)常有香客問我,道長政溃,這世上最難降的妖魔是什么董虱? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上匣砖,老公的妹妹穿的比我還像新娘猴鲫。我一直安慰自己牺弄,他們只是感情好势告,可當我...
    茶點故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著吵护,像睡著了一般馅而。 火紅的嫁衣襯著肌膚如雪瓮恭。 梳的紋絲不亂的頭發(fā)上屯蹦,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天,我揣著相機與錄音购撼,去河邊找鬼迂求。 笑死揩局,一個胖子當著我的面吹牛谐腰,可吹牛的內(nèi)容都是我干的十气。 我是一名探鬼主播砸西,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼莲趣,長吁一口氣:“原來是場噩夢啊……” “哼喧伞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起肋杖,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤怨喘,失蹤者是張志新(化名)和其女友劉穎必怜,沒想到半個月后棚赔,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體靠益,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梯啤。...
    茶點故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖打厘,靈堂內(nèi)的尸體忽然破棺而出户盯,到底是詐尸還是另有隱情先舷,我是刑警寧澤蒋川,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站氮兵,受9級特大地震影響泣栈,放射性物質(zhì)發(fā)生泄漏南片。R本人自食惡果不足惜薪缆,卻給世界環(huán)境...
    茶點故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一拣帽、第九天 我趴在偏房一處隱蔽的房頂上張望减拭。 院中可真熱鬧拧粪,春花似錦既们、人聲如沸啥纸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽护赊。三九已至砾跃,卻和暖如春判耕,著一層夾襖步出監(jiān)牢的瞬間壁熄,已是汗流浹背草丧。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工固棚, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留厂汗,地道東北人呜师。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像汁汗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子祈争,可洞房花燭夜當晚...
    茶點故事閱讀 43,514評論 2 348

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

  • 一:基本概念 Java的所有集合都放在java.util包下菩混,集合跟數(shù)組不同之處在于前者只能保存對象(對象的引...
    Febers閱讀 395評論 0 0
  • 以下是《瘋狂Java講義》中的一些知識,如有錯誤疚脐,煩請指正邢疙。 集合概述 Java集合可以分為Set棍弄、List疟游、Ma...
    hainingwyx閱讀 534評論 0 1
  • 集合概述 集合用來儲存數(shù)量不等的對象乡摹,且只能保存對象,實際保存的是對象的引用變量 主要由兩個接口派生而出瞬痘,Coll...
    Utte閱讀 375評論 0 0
  • 3.3 集合 一方面框全, 面向?qū)ο笳Z言對事物的體現(xiàn)都是以對象的形式,為了方便對多個對象的操作津辩,就要對對象進行存儲容劳。另...
    閆子揚閱讀 722評論 0 1
  • 把相片 讓你能保存 多洗一本 毛衣 也為你多備一層 但是 你孤單時刻 安慰的體溫 怎么為你 多留一份 我不愿讓你一...
    啊嘉啊嘉閱讀 293評論 0 0