modCount 更新了,expectedModCount 并未更新,所以会抛出
ConcurrentModificationException 异常。
安全失败
采用安全失败机制的集合容器,在遍历时不是直接在集合内容上访问的,而是先
复制原有集合内容,在拷贝的集合上进行遍历。所以在遍历过程中对原集合所作
的修改并不能被迭代器检测到,所以不会抛出
ConcurrentModificationException 异常。缺点是迭代器遍历的是开始遍历那一
刻拿到的集合拷贝,在遍历期间原集合发生了修改,迭代器是无法访问到修改后
的内容。java.util.concurrent 包下的容器都是安全失败,可以在多线程下并
发使用。
如何边遍历边移除 Collection 中的元素?
从上文**“快速失败机制”**可知在遍历集合时如果直接调用 remove()方法会抛出
ConcurrentModificationException 异常,所以使用迭代器中调用 remove()方法。
Array 和 ArrayList 有何区别?
· Array 可以包含基本类型和对象类型,ArrayList 只能包含对象类型。
· Array 大小是固定的,ArrayList 的大小是动态变化的。(ArrayList 的扩容是个常见
面试题)
· 相比于 Array,ArrayList 有着更多的内置方法,如 addAll(),removeAll()。
· 对于基本类型数据,ArrayList 使用自动装箱来减少编码工作量;而当处理固定大小
的基本数据类型的时候,这种方式相对比较慢,这时候应该使用 Array。
comparable 和 comparator 的区别?
� comparable 接口出自 java.lang 包,可以理解为一个内比较器,因为实现了
Comparable 接口的类可以和自己比较,要和其他实现了 Comparable 接口类比较,
可以使用 compareTo(Object obj)方法。compareTo 方法的返回值是 int,有三
种情况:
1. 返回正整数(比较者大于被比较者)
2. 返回 0(比较者等于被比较者)