JavaCore之Map的遍歷方式

1. Map的遍歷方式

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

public class TestMap {
	public static void main(String[] args) {
		HashMap<Integer, String> map = new HashMap<>();
		map.put(1, "a");
		map.put(2, "b");
		map.put(3, "c");
		map.put(4, "d");
		map.put(5, "e");

		// First Method
		System.out.println("First Method:Map.keySet");
		for (Integer key : map.keySet()) {
			String value = map.get(key);
			System.out.println("key=>" + key + ",value=>" + value);
		}

		// Second Method
		System.out.println("Second Method:Map.entrySet and iterator");
		Iterator<Map.Entry<Integer, String>> iterator = map.entrySet().iterator();
		while (iterator.hasNext()) {
			Map.Entry<Integer, String> entry = iterator.next();
			System.out.println("key=>" + entry.getKey() + ",value=>" + entry.getValue());
		}

		// Third Method
		System.out.println("Third Method:Map.entrySet");
		for (Map.Entry<Integer, String> entry : map.entrySet()) {
			System.out.println("key=>" + entry.getKey() + ",value=>" + entry.getValue());
		}

		// Fourth Method
		System.out.println("Fourth Method:Map.values()");
		for (String value : map.values()) {
			System.out.println("value=>" + value);
		}
	}
}

2. Map詳解

Map詳解

3. Iterator用法

3.1 源碼

    package java.util;  
    public interface Iterator<E> 
    {  
        boolean hasNext();  
        E next();  
        void remove();  
    }  
  • 容器調用iterator()要求集合類容器返回一個Iterator對象。
    注意:好多集合類都實現了java.lang.Iterable接口,這樣容器對象就可以調用iterator()方法。
  • hasNext() 檢查容器中是否還有元素。
  • next() 獲得容器中的下一個元素。第一次調用時,它返回容器的第一個元素。
  • remove() 將迭代器新返回的元素刪除。
  • Iterator是Java迭代器最簡單的實現,爲List設計的ListIterator具有更多的功能,它可以從兩個方向遍歷List,也可以從List中插入和刪除元素。

3.2 Fail-Fast機制

我們知道的是ArrayList是線程不安全的,如果在使用迭代器的過程中有其他的線程修改了List就會拋出ConcurrentModificationException這就是Fail-Fast機制,爲了防止多線程下迭代的不安全操作。
那麼快速失敗究竟是個什麼意思呢?
在ArrayList類創建迭代器之後,除非通過迭代器自身removeadd對列表結構進行修改,否則在其他線程中以任何形式對列表進行修改,迭代器馬上會拋出異常,快速失敗。

3.3 用法例舉

List l = new ArrayList();
 l.add("aa");
 l.add("bb");
 l.add("cc");
 for (Iterator iter = l.iterator(); iter.hasNext();) {
     String str = (String)iter.next();
     System.out.println(str);
 }
 /*迭代器用於while循環
 Iterator iter = l.iterator();
 while(iter.hasNext()){
     String str = (String) iter.next();
     System.out.println(str);
 }
 */

3.4 Iterator進階

  • 枚舉Enumeration 和Iterator接口之間的差異是什麼?
    枚舉是快迭代兩倍,使用非常少的內存。枚舉適合基本需求。但Iterator是更安全,因爲它總是拒絕其他線程修改它正在迭代集合中的對象。
  • Iterator和ListIterator之間有什麼不同?
    我們可以使用迭代器Iterator遍歷Set和List集合,而ListIterator只可以使用List。
    迭代器遍歷只有向前的方向,而ListIterator可以用來在兩個方向遍歷。
    ListIterator繼承Iterator接口,並配備了額外的功能,如添加元素,更換一個元素,能獲得上一個和下一個元素的索引位置。
  • fail-fast與fail-safe有什麼區別?
    Iterator的fail-fast屬性與當前的集合共同起作用,因此它不會受到集合中任何改動的影響。Java.util包中的所有集合類都被設計爲fail-fast的,而java.util.concurrent中的集合類都爲fail-safe的。當檢測到正在遍歷的集合的結構被改變時,Fail-fast迭代器拋出ConcurrentModificationException,而fail-safe迭代器從不拋出ConcurrentModificationException。
  • Iterator優點?
    ①迭代器可以提供統一的迭代方式。
    ②迭代器也可以在對客戶端透明的情況下,提供各種不同的迭代方式。
    ③迭代器提供一種快速失敗機制,防止多線程下迭代的不安全操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章