天天看點

java集合類_Java集合類

集合介紹

Java集合類是一種特别的工具類,可以儲存對象,并實作了常用的資料結構,另外還能儲存具有映射關系的關聯數組。集合大緻分為Set,List,Queue,Map四種,其中Set代表無序、不可重複,List代表有序、重複,Map則代表具有映射關系,Java5增加了Queue集合,代表一種隊列集合實作。Java集合就像一種容器,把多個對象放到容器中。Java5之前,J集合會丢失對象的資料類型,把所有對象都當成Object類型,從Java5開始增加了泛型,集合可以記住容器中對象的資料類型,進而能編寫更簡潔的代碼。

所有的集合類都位于java.util包下,後來在java.util.concurrent包下提供了多線程集合類。集合類和數組不太一樣,數組元素可以是基本資料類型,也可以是對象;而集合隻能儲存對象(實際儲存的是對象的引用變量)。集合類主要由兩個接口來實作,Collection和Map,兩個根接口。

java集合類_Java集合類

上圖有Map接口的衆多實作類,這些類在功能、用法上存在一定的差異,但它們都有一個功能特征,儲存的每項資料是Key-value鍵值對。Map的Key是不可重複的,key用于辨別集合集合裡的每項資料,如果要查資料,根據Key來擷取。添加一個對象到集合中,Set集合無法記住這個元素的順序,系統無法識别,是以Set裡的元素不能重複。

對于這四種集合,其中常用的有:HashSet、TreeSet、ArrayList、ArrayDeque、LinkedList、HashMap和TreeMap等實作類。

Collection和Iterator接口

Collection接口是List,Set,Queue接口的父接口,如果接口沒弄明白,可以看看之前的文章Java的異常、多态要點及抽象類和接口。Collection接口定義了如下方法:

boolean add(Object o)

向集合裡添加一個元素,如果添加成功則傳回true

boolean addAll(Collection c)

把集合内元素添加到指定集合,成功傳回true

void clear()

清除集合内所有元素,将集合長度變為0

boolean contains(Object o)

傳回集合是否包含指定元素

boolean containsAll(Collection c)

傳回集合是否包含集合c所有元素

boolean isEmpty()

傳回集合是否為空,長度為0傳回true

Iterator iterator()

傳回一個Iterator對象用于周遊

boolean remove(Object o)

删除指定元素o,如果有多個删除第一個

boolean retainAll(Collection c)

從集合中删除集合c裡不包含的元素,相當于求和集合c的交集

int size()

傳回集合裡元素個數

Object[] toArray()

将一個集合轉換成數組

boolean remove(Collection c)

從集合中删除集合c裡包含的元素

具體可閱讀API文檔,裡面有詳細資訊。編譯時可能會輸出一些警告,提醒沒有使用泛型來限制集合内元素類型,不過之後會提到泛型程式設計。當使用System.out的println方法來輸出集合對象時,将輸出[e1,e2...]形式,這是因為所有Collection實作類重寫了toString方法,該方法可一次性輸出集合中所有元素。如果想依次通路集合中的每一個元素,則需要使用某種周遊方法。

集合的周遊

一、Lambda表達式周遊

Java8為Iterable接口新增了一個forEach方法,參數類型是一個函數式接口,而Iterable接口是Collection接口的父接口,是以Collection集合類也可以調用該方法。當調用Iterable的forEach(Consumer a)方法時,程式将集合元素傳給Consumer的accept(T t)抽象方法,然後用Lambda表達式周遊。

Collection names = new HashSet();

names.add("張三");

names.add("李四");

names.forEach(obj ->System.out.println(" "+obj));

二、Java8增強Iterator周遊集合

Iterator接口也是Java集合架構的成員,但它與Collection、Map不一樣,它們是用來放對象的,而Iterator則用于周遊Collecton集合中的元素,Iterator對象也被稱為疊代器。

Iterator接口定義了如下4種方法:

boolean hasNext():如果沒有周遊完,則傳回true

Object next():傳回集合的下一個元素,注意是Object對象

void remove():删除集合上一次next方法傳回的元素

void forEachRemaining(Consumer a):Java8新增的方法,該方法可使用Lambda表達式周遊集合

Collection names = new HashSet();

names.add("張三");

names.add("李四");

Iterator it = names.iterator();

while(it.hasNext()){

String name = (String)it.next();

System.out.println(name);

if(name.equals("張三")){

it.remove();//names.remove(name);将報錯

}//疊代時不能改變集合元素的值

}

Iterator僅用于周遊集合,本身不提供裝載對象的能力。如果要建立一個Iterator對象,則必須要有一個被周遊的集合,沒有集合那要Iterator何用。疊代器采用快速報錯fail-fast機制,一旦檢測到集合已被修改,抽象立即發出ConcurrentModificationException異常,而不是顯示修改後的結果,這樣可以避免在共享資源時而引發異常問題。

三、用foreach循環周遊集合

除了可以使用Iterator接口疊代通路Collection集合裡元素之外,使用Java5提供的foreach循環疊代通路更簡單。

Collection names = new HashSet();

names.add("張三");

names.add("李四");

for(Objection obj : names){

String name = (String)obj;

System.out.println(name);

}

與Iterator接口疊代集合元素類似,foreach循環中的疊代變量也不是集合元素本身,系統隻是把值賦給變量,同樣集合也不能改變。

使用Lambda表達式周遊Iterator

Java8為Iterator新增forEachRemaining()方法,該方法所需參數同樣也是函數式接口,原理類似,調用時将集合元素傳給Consumer的accept(T t)方法。

Collection names = new HashSet();

names.add("張三");

names.add("李四");

Iterator it = names.iterator();

it.forEachRemaining(obj -> System.out.println(" "+obj));

java集合類_Java集合類

本質上還是周遊集合names,所有上面的方法也可以歸為周遊集合方法的一種,利用Iterator的forEachRemaining方法和Lambda表達式周遊,又比Iterator自己提供的方法周遊簡潔了一點。

最近優化了站點留言,歡迎通路主站點!