標籤:增加 看到了 inf tail iterable detail tor rabl odi
畢業這麼久,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