集合概述
?Java提供集合類,集合類主要負責保存死遭、盛裝其他數(shù)據(jù)凯旋,因此集合類也被稱為容器類。所有集合類都位于java.util包下钠署。
?Java的集合類主要由兩個接口派生而出:Collection和Map荒椭,Collection和Map是Java集合框架的根接口,這兩個接口又包含了一些子接口或?qū)崿F(xiàn)類戳杀。
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)換。