Java牛客网面试每日一记4

  1. Java集合类框架的基本接口有哪些?
  2. 为什么集合类没有实现 Cloneable, Serializable 接口?
  3. 什么是迭代器  (Iterator) ?
  4. Iterator 和 ListIterator 的区别是什么?
  5. 快速失败 (fail-fast) 和安全失败 (fail-safe) 的区别是什么?

1:Java 中的集合框架一般包括两种类型的容器。一种是集合,存储一个元素集合;一种是图,存储键值对映射。Java 的集合框架的基本接口有:Collection:代表一组对象,每一个对象都是子元素。Set:存储不包含重复的 Collection 元素。List:存储包含重复的 Collection 元素。Map:存储键值对映射的对象,键不能重复。

2:Cloneable, Serializable这两个接口一个克隆,一个序列化,只与具体实现相关,因此在顶层框架中不需要实现。在框架的具体实现类中就有实现。

3:迭代器是一种设计模式,是一个对象。Iterator 接口提供了很多对集合元素进行迭代的方法。使用迭代器进行集合元素的遍历时,不需要关注对象的内部细节。使用迭代器删除元素时,不能使用对象的remove 方法,应该使用迭代器的 remove 方法进行删除,避免异常

4:Iterator:可以遍历 list,set 集合;并且只能前向遍历  ListIterator:只能遍历 List 集合,可以双向遍历,另外相比 Iterator 有额外的方法进行元素的操作

5:快速失败与安全失败是迭代器进行遍历时的一种机制。首先:java.util 包下都是快速失败  java,util.concurren 包下都是安全失败

快速失败是指 线程 A 对集合 O 进行遍历操作时,线程 B 对集合 O 进行了修改集合元素的操作 (线程 A 本身在遍历过程中对集合元素 O 有修改操作),导致集合 A 抛出异常。之所以会出现这种状况是因为迭代器在遍历时使用到了 modCount 对象,每次迭代器在遍历时都会检查 modCount 的值,如果集合元素发生改变,那么 modCount 也会发生改变。而执行 next / hasnext 方法时会检查 modCount 的值是否符合预期,不符合,遍历失败,抛出异常。 

安全失败是指迭代器在进行元素变量时,拷贝了集合对象,迭代器会在拷贝的集合对象身上进行遍历,在遍历过程中对原对象的修改操作不会影响当前迭代器的操作,故而不会抛出异常。

posted @ 2021-10-17 22:11  十七筱  阅读(53)  评论(0)    收藏  举报