Java Review (二十五、集合----- Iterator接口)
Iterator接口 也是 Java 集合框架的成員 , 但它與 Collection 系列 、 Map 系列 的集合不 一樣 : Collection系列集合、 Map 系列集合主要用于盛裝其他對象,而 Iterator 則主要用于遍歷(即迭代訪問) Collection集合中的元素, Iterator 對象也被稱為迭代器 。
Iterator 接口隱藏了各種 Collection實現類的底層細節,向應用程序提供了遍歷 Collection 集合元素的統一編程接口 。
Iterator 接口里定義了如下 4 個方法 :
boolean hasNext(): 如果被迭代的集合元素還沒有被遍歷完 ,則返回 true 。
Object next(): 返回集合里的下一個元素 。
void remove(): 刪除集合里上一次 next 方法返回的元素 。
void forEachRemaining(Consumer action) ,這是 Java 8 為Iterator 新增的默認方法,該方法可使用Lambda 表達式來遍歷集合元素 。
下面程序示范了通過 Iterator 接口來遍歷集合元素 :
public class IteratorTest { public static void main(String[] args) { // 創建集合、添加元素的代碼與前一個程序相同 Collection books = new HashSet(); books.add("輕量級Java EE企業應用實戰"); books.add("瘋狂Java講義"); books.add("瘋狂Android講義"); // 獲取books集合對應的迭代器 Iterator it = books.iterator(); while(it.hasNext()) { // it.next()方法返回的數據類型是Object類型,因此需要強制類型轉換 String book = (String)it.next(); System.out.println(book); if (book.equals("瘋狂Java講義")) { // 從集合中刪除上一次next方法返回的元素 it.remove(); } // 對book變量賦值,不會改變集合元素本身 book = "測試字符串"; //① } System.out.println(books); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Iterator 僅用于遍歷集合 , Iterator 本身并不提供盛裝對象的能力 。
當使用 Iterator 迭代訪問 Collection 集合元素時 , Collection 集合里的元素不能被改變,只有通過Iterator 的 remove()方法刪除上 一 次 next()方法返回的集合元素才可以;否則將會引發 java .util.ConcurrentModificationException 異常 。 下面程序示范了這一 點 :
public class IteratorErrorTest { public static void main(String[] args) { // 創建集合、添加元素的代碼與前一個程序相同 Collection books = new HashSet(); books.add("輕量級Java EE企業應用實戰"); books.add("瘋狂Java講義"); books.add("瘋狂Android講義"); // 獲取books集合對應的迭代器 Iterator it = books.iterator(); while(it.hasNext()) { String book = (String)it.next(); System.out.println(book); if (book.equals("瘋狂Android講義")) { // 使用Iterator迭代過程中,不可修改集合元素,下面代碼引發異常 books.remove(book); } } } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Iterator 法代器采用的是快速失敗( fail-fast ) 機制, 一 旦在迭代過程中檢測到該集合己經被修改(通常是程序中的其他線程修改),程序立即引發 ConcurrentModificationException 異常,而不是顯示修改后的結果,這樣可以避免共享資源而引發的潛在問題。
Java 8 起為Iterator 新增了 一個 forEachRemaining(Consumer action)方法,該方法所需的 Consumer參數同樣也是函數式接口 。 當程序調用 Iterator 的 forEachRemaining(Consumer action)遍歷集合元素時,程序會依次將集合元素傳給 Consumer的 accept(T t)方法(該接口中唯一的抽象方法) 。
如下程序示范了使用 Lambda 表達式來遍歷集合元素:
public class IteratorEach { public static void main(String[] args) { // 創建集合、添加元素的代碼與前一個程序相同 Collection books = new HashSet(); books.add("輕量級Java EE企業應用實戰"); books.add("瘋狂Java講義"); books.add("瘋狂Android講義"); // 獲取books集合對應的迭代器 Iterator it = books.iterator(); // 使用Lambda表達式(目標類型是Comsumer)來遍歷集合元素 it.forEachRemaining(obj -> System.out.println("迭代集合元素:" + obj)); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
除了使用迭代器以外,使用 Java 5 提供的 foreach 循環迭代訪問集合元素更加便捷 。
如下程序示范了使用 foreach 循環來迭代訪問集合元素 :
public class ForeachTest { public static void main(String[] args) { // 創建集合、添加元素的代碼與前一個程序相同 Collection books = new HashSet(); books.add(new String("輕量級Java EE企業應用實戰")); books.add(new String("瘋狂Java講義")); books.add(new String("瘋狂Android講義")); for (Object obj : books) { // 此處的book變量也不是集合元素本身 String book = (String)obj; System.out.println(book); if (book.equals("瘋狂Android講義")) { // 下面代碼會引發ConcurrentModificationException異常 books.remove(book); //① } } System.out.println(books); } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
API:java.util.Iterator
參考:
【1】:《瘋狂Java講義》
Android Java
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。