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优点?
①迭代器可以提供统一的迭代方式。
②迭代器也可以在对客户端透明的情况下,提供各种不同的迭代方式。
③迭代器提供一种快速失败机制,防止多线程下迭代的不安全操作。