集合输出
1.Collection输出
2. foreach(增强for循环) :语法糖
本质上也为迭代器输出
Collection接口能采用foreach输出的本质在于:所有子类都实现了Iterator接口
**语法糖:**只存在于代码代码编译阶段 例如:泛型,自动拆装箱,foreach()
3.ListIterstor (双向迭代输出-只有List接口有)
3.1 方法
要想使用从后向前输出,必须先从前到后输出一次
boolean hasPrevious();//从后向前输出
E previous();
4. Enumeration(枚举输出-只有Vector及其子类Stack才有)
Vector独有枚举输出
4.1 方法
1,判断是否有下一个元素
boolean hasMoreElements
2,取得元素
public E nextElements()
5.快速失败策略(fail-fast)
5.1 什么是快速失败
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
/**
* @Name:
* @Author:ZYJ
* @Date:2019-06-22-19:29
* @Description:
*/
public class IteratorTest {
public static void main(String[] args) {
List<String> list = new Vector<>();
list.add("hello");
list.add("java");
list.add("hello");
list.add("world");
Iterator<String> iterator= list.iterator();
while (iterator.hasNext()){
list.remove("hello");
System.out.println(iterator.next());
}
}
}
上述程序会产生如下异常
java.util.ConcurrentModificationException
优先处理异常情况,出现异常情况发生,直接向用户抛出异常,程序终止;
fail-fast保证集合在多线程场景下读到正确的值。
java.util.
的集合类大多数都采用此策略(ArrayList,Vector,LinkedList,HashSet),这些类读写都在同一个子类。
fail-safe:不会抛出并发修改异常(ConcurrentModificationException)
java.util.concurrent
:下的子类都属于此集合:CopyOnWriteArrayList
、concurrentHashMap
CopyOnWriteArrayList
采用读写分离,所有的读为异步操作,写为同步操作,且读写不再一个副本中
在迭代输出集合时,并发修改了集合的结构
在Collection接口及其子类中有 modcount参数:用于记录集合修改(add、remove)的次数
protection transient int modCount=0;
在迭代器内部:维护属性 exceptedModCount,用于取得集合迭代器时的modCount
int exceptedModcount=modCount;
final void checkForComodification(){
if(modcount!=exceptedModeCount){
throw new ConcurrentModificationException();
}
}
5.2 如何避免并发修改异常
1,迭代输出的时候,不要修改集合内容
2,使用迭代器的修改方法。(迭代器的remove方法会将modcount和exceptedModCount动态修改);
n();
}
}
### 5.2 如何避免并发修改异常
1,迭代输出的时候,不要修改集合内容
2,使用迭代器的修改方法。(迭代器的remove方法会将modcount和exceptedModCount动态修改);