Java中的集合類型體系(一)


Java中的集合類型體系(一)

提問:為什么需要集合?

       通常情況下,程序需要根據運行時才知道創建了多少對象。若非程序運行時,而在開發階段,我們並不知道創建了多少對象,甚至不知道對象的准確類型,為了滿足常規的編程需要,我們要求能在任何時候,任何地點創建任意數量的對象,但是用什么容器要存放這些對象呢?首先可能會想到用數組存放,但是數組只能存放同一類型的數據,且數組長度是固定的。所以用什么來存放更合適呢?就這樣,集合便應運而生了。

一、集合的概念

 Java中的集合類統一封裝在java.util包中,是一個用來存放對象的容器。它允許以各種方式將元素分組,並定義了各種使這些元素更容易操作的方法。集合類是可以往里面保存多個對象的類,存放的是對象,不同的集合類有不同的功能和特點,適合不同的場合,用以解決一些實際問題。

注意點:

1、集合只能存放對象。如果存入基本數據類型,如將int型數據10存入集合中,集合會將int自動轉換成其封裝類Integer存入,Java中每一種基本數據類型都有對應的引用類型;

2、集合存放的對象的引用,而非對象本身。所以我們稱集合中的對象就是集合中對象的引用。對象本身還是放在堆內存中。

3、集合可以存放不同類型,不限數量的數據類型。

二、Java中集合體系框架

 

圖1 集合框架簡圖

從上圖可以看出:上述的所有集合類,除了Map集合系列,即左邊的集合都實現了Iterator接口。

Iterator接口用來遍歷集合當中的元素,有hashNext()、next()、remove()三個處理集合的方法;

ListIterator接口繼承Iterator接口,在它的基礎上又添加了三種處理集合的方法,分別為:add(),previous(),hasPrevious()等。

集合的兩大的部分:

1、集合主要分為Collection接口Map接口

2、Collection接口分別被Queue、List和Set三個接口繼承;

3、List接口被AbstractList實現,分為三個子類:LinkedList、ArrayList、Vector;

4、Set接口被AbstractSet實現,分為兩個子類:HashSet、TreeSet;

5、Map接口被AbstractMap實現,分為兩個子類:HashMap、TreeMap;

6、Map接口被HashTable實現。

常用集合的分類

圖2 常用集合的分類

三、集合和數組的區別

 

圖3 集合與數組區別

四、Iterator迭代器

(一)、Iterator接口是Java中集合的頂層接口。(不包含Map系列接口,Map接口是Map系列集合的頂層接口)。

三個方法:

1、Object next():返回迭代器剛越過元素的引用,返回值是Object,需要根據需要強制轉換;

2、boolean hashNext():判斷迭代器中是否還有供訪問的元素;

3、void remove():刪除迭代器中越過的元素。

除了Map集合系列,程序都可以通過Iterator迭代器來遍歷集合中的元素。

(二)、Iterator與Iterable

Iterable接口封裝在java.util包中,

1 public interface Iterable<T>{
2     /**
3     * Returns an iterator over elements of type {@code T}
4     *
5     * @return an Iterator
6     */
7     Iterator<T> iterator();
8     ...
9 }

 從上面代碼可以看出,Iterable接口封裝了Iterator接口,所以只要子類實現了Iterable接口,就可以使用Iterator迭代器的功能了。

(三)、ListIterator接口

由於Iterator值提供了next()、hashNext()、remove()功能,如果我們想在使用迭代器遍歷的同時添加元素,該怎么辦呢?

這里提供兩種方式:

1、自定義接口或者實現類,實現Iterator接口,在自定義實現類或接口中添加相應的功能;

2、使用Iterator的子接口ListIterator

具體運用哪種方式,具體依據需求而定,這里主要說明一下第二種方式。

ListIterator接口繼承自Iterator接口,在其基礎上擴展了一些常用的方法,如下圖:

 

圖4 ListIterator中的方法

五、Collection接口介紹

COllection接口是List和Set集合的頂層接口,封裝了集合操作的基本功能。

Collection接口分別有List子接口和Set子接口:

  1、List接口:元素按進入先后有序保存,可重復,元素有序 ;

  2、Set接口:僅接收一次,不可重復,元素無序 ;

Collection定義的方法:

圖5 Collection接口定義的方法

 

六、工具類Collections、Arrays及對數組的操作方法

(一)、Collections:封裝在java.utils包中,集合框架中的一個工具類。該類中的方法都是靜態的。

Collections有三個靜態字段:EMPTY_LISTEMPTY_MAPEMPTY_SET;這三個字段分別返回一個空的List,Map和Set並且是不可修改的,當我們試圖修改這三個返回的集合容器時,會拋出UnsupportedOperationException異常;之所以不能修改這三個返回的集合容器,原因是被返回的這三個容器都是final所修飾的。

    1、常用的方法:

  

圖6 Collections常用方法

 

(二)、Arrays:封裝在java.utils包中,用於操作數組的工具類。里面都是靜態方法。

該類包含用於操作數組的各種方法(如排序和搜索)。 該類還包含一個靜態工廠,可以將數組視為列表。

1、常用的方法:

圖7 Arrays常用方法

 

(三)、集合對數組的操作方法

1、將數組變成集合的好處:可以使用集合的方法和思想來操作數組中的元素。

2、將數組轉換成集合后,只能使用遍歷,而不能使用集合中增刪改方法,因為數組的長度是固定的,如果你增刪。那么會產生UnsupportedOperationException報錯。

3、數組轉換為集合:一般用Arrays.asList(T ... a)方法,將數組變成List集合。

4、集合轉換為數組:可以使用toArray()toArray(T[] a)將集合轉換為數組。

toArray():返回一個包含此集合中所有元素的數組。

toArray(T[] a):返回一個包含此集合中所有元素的數組; 返回的數組的運行時類型是指定數組的運行時類型。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM