參考文獻(xiàn):《Java瘋狂講義》(第三版)
Java集合類是一種特別有用的工具類,可用于存儲(chǔ)數(shù)量不等的對(duì)象,并可以實(shí)現(xiàn)常用的數(shù)據(jù)結(jié)構(gòu)。除此之外,Java集合還可用于保存具有映射關(guān)系的關(guān)聯(lián)數(shù)組。
Java集合大致可分為:
1、Set:無(wú)序、不可重復(fù)的集合;
2、List:有序,重復(fù)的集合;
3、Queue:Java5增加,隊(duì)列集合實(shí)現(xiàn);
4、Map:具有映射關(guān)系的集合;
四種體系。
Java的集合類主要有兩個(gè)接口派生而出:Collection和Map。
Collection和Map是Java集合框架的根接口,這兩個(gè)接口又包含了子接口或?qū)崿F(xiàn)類。如圖


Collection接口是List、Set和Queue接口的父接口,該接口里定義的方法既可用于操作Set集合,也可用于操作List和Queue集合。
常用方法:
1、boolean add(object o):添加元素,成功返回true;
2、boolean addAll(Collection c):添加集合c里所有元素;
3、void clear():清楚集合里的所有元素,將集合長(zhǎng)度變?yōu)?;
4、boolean contains (Object o):返回集合里是否包含指定元素;
5、boolean containsAll(Collection):返回集合里是否包含集合c里的所有元素;
6、boolean isEmpty():返回集合是否為空;
7、boolean remove(Object o):刪除集合中的指定元素o,當(dāng)集合中包含了一個(gè)或者多個(gè)元素o時(shí),該方法值刪除第一個(gè)符合條件的元素,成功返回true;
8、boolean removeAll(Collection c):刪除集合c中里不包含的元素(交運(yùn)算),如果該操作改變了調(diào)用該方法的集合,則該方法返回true
9、int size():返回集合里元素的個(gè)數(shù);
10、Object[] toArray():該方法把集合轉(zhuǎn)換成一個(gè)數(shù)組,所有的集合元素變成對(duì)應(yīng)的數(shù)組元素。
使用Lambda表達(dá)式遍歷集合
Java8為Iterable接口新增了一個(gè)forEach(Consumer action)默認(rèn)方法,Iterable接口是Collection接口的父接口,所以Collection集合可以直接調(diào)用該方法。
import java.util.*;
public class CollectionEach{
public static void main(String[] args) throws Exception{
Collection books=new HashSet();
books.add("Hello");
books.add("World");
books.add("Learning Java is so happy");
books.forEach(obj->System.out.println(obj));
}
}
Iterator接口(迭代器)
Iterator接口也是Java集合框架的成員,但它與Collection系列,Map系列的集合不一樣。
Collection系列,Map系列的集合主要用于盛裝其他對(duì)象,而Iterator則主要用于遍歷(迭代訪問(wèn))。
Iterator接口定義了4個(gè)方法:
1、boolean hasNext():如果被迭代的集合還沒(méi)有被遍歷完,則返回true;
2、Object next():返回集合里的下一個(gè)元素;
3、void remove:刪除集合里上一次next方法返回的元素;
4、void forEachRemaining(Consumer action):這時(shí)Java8為Iterator新增的默認(rèn)方法,該方法可使用lambda表達(dá)式來(lái)遍歷集合;
知識(shí)點(diǎn):Iterator必須依附于Collection對(duì)象,若有一個(gè)Iterator對(duì)象,則必然有一個(gè)與之關(guān)聯(lián)的Collection對(duì)象。Iterator提供了兩個(gè)方法來(lái)迭代訪問(wèn)Collection集合里的元素,并可通過(guò)remove()方法來(lái)刪除集合中上一次next()方法返回集合元素。
知識(shí)點(diǎn):Iterator迭代器采用的是快速失敗機(jī)制,一旦在迭代過(guò)程中檢測(cè)到該集合已經(jīng)被修改(通常是被其他線程所修改),程序立即引發(fā)ConcurrentModificationException異常,而不是顯示修改后的結(jié)果,這樣可以避免共享資源而引發(fā)的潛在問(wèn)題。
Predicate操作集合
Java8為Collection集合新增了一個(gè)removeIf(Predicate filter)方法。
該方法將會(huì)批量刪除復(fù)合filter條件的所有元素。
Predicate也是函數(shù)式接口(Consumer類),因此可以使用Lambda表達(dá)式。
Stream操作集合
Java8還新增了Stream、IntStream、LongStream、DoubleStream等流式API,這些ApI代表多個(gè)支持串行和并行聚集操作的元素。
Java8還為上面每個(gè)流式API提供了對(duì)應(yīng)的Builder(建設(shè)者模式)
獨(dú)立使用Stream的步驟如下:
1、使用Stream或XxxStream的buiilder()類方法創(chuàng)建該Stream對(duì)應(yīng)的Builder。
2、重復(fù)調(diào)用Builder的add()方法向該流中添加多個(gè)元素。
3、調(diào)用Builder的build()方法獲取對(duì)應(yīng)的Stream
4、調(diào)用Stream的聚集方法
Stream提供了大量的方法來(lái)聚集操作,這些方法既可以是“中間的”,也可以是末端的。
中間方法:中間操作允許流保持打開(kāi)狀態(tài),并允許直接調(diào)用后續(xù)方法。
末端方法:末端方法是對(duì)流的最終操作。當(dāng)對(duì)某個(gè)Stream執(zhí)行末端方法后,該流將會(huì)被“消耗”且不可再用。
