天天看點

java集合架構之集合的疊代操作

1.集合的疊代操作

  把集合做的元素一個一個的周遊取出來.

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

疊代器對象:

    Iterator: 疊代器對象,隻能從上往下疊代.

        boolean  hasNext(); 判斷目前指針後是否有下一個元素

        Object    next():擷取指針的下一個元素,并且移動指針.

    ListIterator:  是Iterator接口的子接口,支援雙向疊代,從上往下疊代,從下往上疊代.

    Enumeration:古老的疊代器對象,現在已經被Iterator取代了. 适用于古老的Vector類.

java集合架構之集合的疊代操作
import java.util.ArrayList;
import java.util.Iterator;

public class CollectionDemo7 {
	public static void main(String[] args) {
		ArrayList<String> list = new ArrayList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");

		//1.for循環
		for (int i = 0; i < list.size(); i++) {
			String ele = list.get(i);
			System.out.println(ele);
		}
		System.out.println("-----------------------------------");
		//2.for-each增強for循環
		for (String ele : list) {
			System.out.println(ele);
		}
		System.out.println("-----------------------------------");
		//3.使用while循環的Iterator疊代器
		Iterator<String> iterator = list.iterator();
		while (iterator.hasNext()) {
			String ele = (String) iterator.next();
			System.out.println(ele);
		}
		System.out.println("-----------------------------------");
		//4.使用for循環的Iterator疊代器,這種更好,因為for循環中的變量用完之後就清理了,不會占用記憶體
		for (Iterator iterator2 = list.iterator(); iterator2.hasNext();) {
			String ele = (String) iterator2.next();
			System.out.println(ele);

		}
	}
}
           
import java.util.Enumeration;
import java.util.Vector;

public class CollectionDemo8 {
	public static void main(String[] args) {
		Vector<Integer> vector = new Vector<>();
		vector.add(1);
		vector.add(2);
		vector.add(3);
		vector.add(4);
		//古老的疊代器對象
		Enumeration<Integer> elements = vector.elements();
		while (elements.hasMoreElements()) {
			Integer ele = (Integer) elements.nextElement();
			System.out.println(ele);
			
		}
		System.out.println("---------------------------------------------------");
		//古老的疊代器對象,使用for循環
		for(Enumeration<Integer> en =vector.elements();en.hasMoreElements();){
			System.out.println(en.nextElement());
		}
	}
}
           

深入分析for-each和疊代器:

1):foreach可以操作數組:        底層依然采用for循環+ 索引來擷取數組元素.

2):foreach可以操作Iterable的執行個體: 底層其實采用的Iterator(疊代器).

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

直接使用foreach疊代數組和集合元素即可,簡單.

for-each的文法格式:

for(類型 變量 :數組名/Iterable的執行個體){

          //TODO

}

java集合架構之集合的疊代操作

注意:當需要邊疊代集合元素,邊删除指定的元素時:此時隻能使用疊代器.而且隻能使用疊代器對象的remove方法.

import java.util.ArrayList;
import java.util.List;

public class CollectionDemo9 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");
		
		for (String ele : list) {
			System.out.println(ele);
			list.remove(0);
		}
	}
}
           
java集合架構之集合的疊代操作
java集合架構之集合的疊代操作

在疊代集合的時候,邊疊代邊删除是非常常用的操作:

如何解決并發修改異常呢?

   不要使用集合對象的删除方法.

   在Collection接口中存在删除指定元素的方法:boolean  remove(Object ele);該方法隻能從集合中删除元素,不能把疊代器中指定的元素也删除.

   是以:我們得使用Iterator中的remove方法.該方法會從兩個線程中同時移除被删除的元素,.保證了兩個線程的同步.

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

public class CollectionDemo9 {
	public static void main(String[] args) {
		List<String> list = new ArrayList<>();
		list.add("A");
		list.add("B");
		list.add("C");
		list.add("D");

		/*	for (String ele : list) {
				System.out.println(ele);
				list.remove(0);
			}*/
		System.out.println(list);//移除前列印[A, B, C, D]
		Iterator<String> iterator = list.iterator();
		while (iterator.hasNext()) {
			String ele = (String) iterator.next();
			if ("C".equals(ele)) {
				iterator.remove();
			}
		}
		System.out.println(list);//移除後列印[A, B, D]
	}
}