1. 程式人生 > >java集合(一):List、Iterator、Array、ArrayList、LinkList

java集合(一):List、Iterator、Array、ArrayList、LinkList

整體 http 是否 簡潔 畢業 一個 位置 數據 reac

畢業這麽久,java 標準庫中的集合都沒怎麽仔細了解過,準備好好學習學習。

集合(Collection):由一個多個確定的元素所構成的整體叫做 集合--百度百科的解釋。換言之,就是裝元素的容器元素可以是任何類型。

在我們的日常開發,這類工具是必不可少的,所以,好好了解他們的特性,能讓我們寫出更合適的代碼,也是在修煉內功。

------------------------------------------------------------------------------------------

在 Java 中的集合,我覺得可以分類兩類:有序集合List : 元素按照一定順序排列) 和 無序集合

Set : 元素是無序的,此特性也決定了元素是不可重復的)。

對於集合,有一個不可缺少的輔助工具,那就是叠代器(Iterator),為什麽這麽說呢?我們看看 java 中的代

Collection 接口

技術分享圖片

從上邊代碼中可以,在 Collection 接口中, 有一個 Iterator<E> iterator() 方法,這個方法返回:一個實現了 Iterator 接口的對象。利用這個叠代器對象可以依次訪問集合中的對象。

Iterator 接口:

技術分享圖片

想必大多數人都使用 叠代器 遍歷集合,有了上邊的 hasNext() 和 remove() 方法,就可以做到,如下:

List<String> list = new
ArrayList<String>(); Iterator iter = list.iterator(); while( iter.hasNext() ){//如何還有元素 String element = iter.next();//獲取元素 //do something with element }

但是,有人看到了上邊的代碼,可能會覺得有點繁瑣,那麽 java 提供一種更加簡介的方式:for each 循環。

for ( String element : list ){
  //do something with element;  
}

簡潔換來的代價就是,該集合必須是實現了 Iterable 接口,這個接口的定義如下:

技術分享圖片

forEach 方法和 spliterator 方法:都是default方法(java8 之後就開始允許這種騷操作,提供默認實現,不強制實現。參考:http://blog.csdn.net/lin6286878/article/details/53464804),所以,實現 Iterable 接口時,只需要實現 iterator方法即可。

那麽在 java 中,Collection 接口都擴展了 Iterable 接口,那麽,就代表 集合對象都可以使用 for each 達到遍歷的目的

技術分享圖片

----------------------------------------------------------------------------------------------------

知道了 集合 和 叠代器的 關系之後,ArrayList對象具有 數組的特性,那麽操作起來跟數組差不多;不必多說,我們說說 LinkList 對象。

LinkList 對象中的 add 方法,每次都是在鏈表的尾部添加元素,如果我想要在 ListList 對象某個特定位置插入元素呢?放心,java 為我們提供了 ListIterator 接口,在 Iterator 接口基礎上增加了 add 方法,保證了在鏈表可以在任何位置插入元素。叠代器中的指針是指向兩個元素之間,那麽插入元素的位置位 集合元素個數 + 1。

既然叠代器這麽方便,那麽能不能多個叠代器 同時作用於 同一個集合,答案是:可以的,但是有且只有一個叠代器能對集合進行改變(其他只能讀)。

如果多個叠代器可以改變,那麽集合的數據就會變得很亂,那麽如何保證有且只有一個叠代器對集合進行修改呢?

1)每個叠代器維護一個 該寫操作的計數器,

2)集合本身維護一個 改寫操作的計數器,

3)每個叠代器開始處檢查 兩個計數器的值 是否一致,如果一致,則通過,否則 拋出 ModificationException 異常。

java集合(一):List、Iterator、Array、ArrayList、LinkList