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詳解
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類創建迭代器之後,除非通過迭代器自身remove或add對列表結構進行修改,否則在其他線程中以任何形式對列表進行修改,迭代器馬上會拋出異常,快速失敗。
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優點?
①迭代器可以提供統一的迭代方式。
②迭代器也可以在對客戶端透明的情況下,提供各種不同的迭代方式。
③迭代器提供一種快速失敗機制,防止多線程下迭代的不安全操作。