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_LIST,EMPTY_MAP,EMPTY_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):返回一個包含此集合中所有元素的數組; 返回的數組的運行時類型是指定數組的運行時類型。