集合框架-List集合-2

ZHOU_VIP發表於2017-04-22

(4)列表迭代器的特有功能:(瞭解)

    可以逆向遍歷,但是要先正向遍歷,所以無意義,基本不使用。


package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
 * 列表迭代器:
 * 		ListIterator listIterator():List集合特有的迭代器,不是通用的,開發大部分不用它
 * 		該迭代器繼承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法。
 * 
 * 特有功能:
 * 		Object previous():獲取上一個元素
 * 		boolean hasPrevious():判斷是否有元素
 * 
 * 		注意:ListIterator可以實現逆向遍歷,但是必須先正向遍歷,才能逆向遍歷,所以一般無意義,不使用。
 */
public class ListIteratorDemo {
	public static void main(String[] args) {
		// 建立List集合物件
		List list = new ArrayList();
		list.add("hello");
		list.add("world");
		list.add("java");

		// ListIterator listIterator()
		ListIterator lit = list.listIterator(); // 子類物件
		while (lit.hasNext()) {
		    String s = (String) lit.next();
		    System.out.println(s);
		}
		// System.out.println("-----------------");
		

		while (lit.hasPrevious()) {
			String s = (String) lit.previous();
			System.out.println(s);
		}
		System.out.println("-----------------");

		// 迭代器
		Iterator it = list.iterator();
		while (it.hasNext()) {
			String s = (String) it.next();
			System.out.println(s);
		}
		System.out.println("-----------------");

	}
}

(5)併發修改異常

    A:出現的現象

        迭代器遍歷集合,集合修改集合元素

    B:原因

        迭代器是依賴於集合的,而集合的改變迭代器並不知道。

    C:解決方案

        a:迭代器遍歷,迭代器修改(ListIterator)

            元素新增在剛才迭代的位置

        b:集合遍歷,集合修改(size()和get())

            元素新增在集合的末尾


package cn.itcast_04;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;

/*
 * 問題?
 * 		我有一個集合,如下,請問,我想判斷裡面有沒有"world"這個元素,如果有,我就新增一個"javaee"元素,請寫程式碼實現。
 * 
 * ConcurrentModificationException:併發修改異常
   當方法檢測到物件的併發修改,但不允許這種修改時,丟擲此異常。 
 * 產生的原因:
 * 		迭代器是依賴於集合而存在的,在判斷成功後,集合的中新新增了元素,而迭代器卻不知道,所以就報錯了,這個錯叫併發修改異常。
 * 		其實這個問題描述的是:迭代器遍歷元素的時候,通過集合是不能修改元素的。
 * 如何解決呢?
 * 		A:迭代器迭代元素,迭代器修改元素
 * 			元素是跟在剛才迭代的元素後面的。
 * 		B:集合遍歷元素,集合修改元素(普通for)
 * 			元素在最後新增的。
 */
public class ListIteratorDemo2 {
	public static void main(String[] args) {
		// 建立List集合物件
		List list = new ArrayList();
		// 新增元素
		list.add("hello");
		list.add("world");
		list.add("java");

		// 迭代器遍歷
		Iterator it = list.iterator();
		while (it.hasNext()) {
		    String s = (String) it.next();
		    if ("world".equals(s)) {
		    list.add("javaee");	   //ConcurrentModificationException:併發修改異常,迭代器遍歷元素的時候,通過集合是不能修改元素的			
		  }									    
		}

		// 方式1:迭代器迭代元素,迭代器修改元素
		// 而Iterator迭代器卻沒有新增功能,所以我們使用其子介面ListIterator
		ListIterator lit = list.listIterator();
		while (lit.hasNext()) {
		    String s = (String) lit.next();
		    if ("world".equals(s)) {
		    lit.add("javaee");
		  }
		}

		// 方式2:集合遍歷元素,集合修改元素(普通for)
		for (int x = 0; x < list.size(); x++) {
			String s = (String) list.get(x);
			if ("world".equals(s)) {
				list.add("javaee");
			}
		}

		System.out.println("list:" + list);
	}
}


相關文章