background image
承Collection毫无意义,反之亦然。
    如果Map继承Collection接口,那么元素去哪儿?Map包含key-value对,它提供抽取key或value列表
集合的方法,但是它不适合“一组对象”规范。
6.Iterator是什么?
    Iterator接口提供遍历任何Collection的接口。我们可以从一个Collection中使用迭代器方法来获取迭代
器实例。迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者在迭代过程中移除元素。
7.Enumeration和Iterator接口的区别?
    Enumeration的速度是Iterator的两倍,也使用更少的内存。Enumeration是非常基础的,也满足了基础
的需要。但是,与Enumeration相比,Iterator更加安全,因为当一个集合正在被遍历的时候,它会阻止其
它线程去修改集合。
迭代器取代了Java集合框架中的Enumeration。迭代器允许调用者从集合中移除元素,而Enumeration不
能做到。为了使它的功能更加清晰,迭代器方法名已经经过改善。
8.为何没有像Iterator.add()这样的方法,向集合中添加元素?
    语义不明,已知的是,Iterator的协议不能确保迭代的次序。然而要注意,ListIterator没有提供一个add
操作,它要确保迭代的顺序。
9.为何迭代器没有一个方法可以直接获取下一个元素,而不需要移动游标?
    它可以在当前Iterator的顶层实现,但是它用得很少,如果将它加到接口中,每个继承都要去实现它,这
没有意义。
10.Iterater和ListIterator之间有什么区别?
(1)我们可以使用Iterator来遍历Set和List集合,而ListIterator只能遍历List。
(2)Iterator只可以向前遍历,而LIstIterator可以双向遍历。
(3)ListIterator从Iterator接口继承,然后添加了一些额外的功能,比如添加一个元素、替换一个元素、
获取前面或后面元素的索引位置。
11.遍历一个List有哪些不同的方式?
List<String> strList = new ArrayList<>(); //
使用
for-each
循环
 for(String obj : strList){   System.out.println(obj); } //using iterator 
Iterator<String> it = strList.iterator(); while(it.hasNext()){   String obj = it.next();   System.out.println(obj); }
    使用迭代器更加线程安全,因为它可以确保,在当前遍历的集合元素被更改的时候,它会抛出
ConcurrentModificationException。
12.通过迭代器fail-fast属性,你明白了什么?
    每次我们尝试获取下一个元素的时候,Iterator fail-fast属性检查当前集合结构里的任何改动。如果发现
任何改动,它抛出ConcurrentModificationException。Collection中所有Iterator的实现都是按fail-fast
来设计的(ConcurrentHashMap和CopyOnWriteArrayList这类并发集合类除外)。
13.fail-fast与fail-safe有什么区别?
    Iterator的fail-fast属性与当前的集合共同起作用,因此它不会受到集合中任何改动的影响。Java.util包
中的所有集合类都被设计为fail-fast的,而java.util.concurrent中的集合类都为fail-safe的。Fail-fast迭代
器抛出ConcurrentModificationException,而fail-safe迭代器从不抛出
ConcurrentModificationException。
14.在迭代一个集合的时候,如何避免ConcurrentModificationException?
    在遍历一个集合的时候,我们可以使用并发集合类来避免ConcurrentModificationException,比如使
用CopyOnWriteArrayList,而不是ArrayList。