当前位置: 首页 > news >正文

【字节面试】Fail-fast知识点相关知识点

字节面试,问到的一个小知识点,这里做一下总结,其实小编之前有一篇文章,已经对此有过涉及,不过这里知识专项针对于问题,把这个知识点拎出来说一下。

1.问题

什么是Fail-fast机制?
Hashmap是否拥有Fail-fast机制?
ConcurrentModificationException异常原因和解决方法是什么?
哪些你常用的数据结构是Fail-fast的,哪些不是?举例说明一下
Enumeration与Iterator的异同?

在这里插入图片描述

2.探索、解答

2.1 Fail-fast机制

从字面意思,很好理解,就是快速失败机制。映射到java设计中,fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

2.2 ConcurrentModificationException

List在for、while正常遍历过程中,如果remove元素,容易出现ConcurrentModificationException 异常,根本原因的话,之前ArrayList源码分析文章已经讲过,各位有兴趣可以移步阅读。

ConcurrentModificationException发生是因为我们在使用迭代器遍历List的同时,还使用了List相应的remove、add进行元素增加或删除,导致不一。

2.3 Enumeration与Iterator的异同

2.3.1 Iterator

java中迭代器接口的源码很简单,我们看下面


package java.util;import java.util.function.Consumer;public interface Iterator<E> {boolean hasNext();E next();default void remove() {throw new UnsupportedOperationException("remove");}default void forEachRemaining(Consumer<? super E> action) {Objects.requireNonNull(action);while (hasNext())action.accept(next());}
}

就是遍历、移除的接口定义,这块知识我们在Android源码设计模式探索与实战【迭代器模式】一文中,对于迭代器设计模式,做过深入剖析,迭代器模式重在容器类集合提供顺序遍历的方式,其实从上面Demo、实践案例、源码中,大家都可以看到,迭代器模式,实际上就是把不同类型的集合的遍历进行了封装, 这样针对于客户端来说,只需关注迭代器接口,不再需要关心内部使用了什么类型的集合。

2.3.2 Enumeration

我们看一下这个接口的源码

package java.util;/*** @see     java.util.Iterator* @see     java.io.SequenceInputStream* @see     java.util.Enumeration#nextElement()* @see     java.util.Hashtable* @see     java.util.Hashtable#elements()* @see     java.util.Hashtable#keys()* @see     java.util.Vector* @see     java.util.Vector#elements()** @author  Lee Boynton* @since   JDK1.0*/
public interface Enumeration<E> {boolean hasMoreElements();E nextElement();
}

只有是否还有元素的判断接口、遍历下一个元素的两个方法定义,并没有移除方法,所以这个玩意,自然而然就不存在Fail-fast和ConcurrentModificationException了。

2.3.3 Enumeration与Iterator异同总结

其实一看源码,相信大家就立马明白了,Enumeration与Iterator都是java定义的集合遍历接口,不同的是Iterator提供了移除接口。
有了移除操作,自然而然就是涉及到多线程安全性,那么就引入了可能存在的ConcurrentModificationException。

2.4 Fail-fast举例

哪些你常用的数据结构是Fail-fast的,哪些不是?上面源码的时候,其实大家已经看到了答案。
Arraylist、HashMap(LinkedHashmap、HashSet本身就是继承与Hashmap的)是有Fail-fast机制的,因为他们都有迭代器Iterator。而HashTable、Vector的某些遍历方式是没有的,因为它实现与Enumeration。

 * @see     java.util.Iterator* @see     java.io.SequenceInputStream* @see     java.util.Enumeration#nextElement()* @see     java.util.Hashtable* @see     java.util.Hashtable#elements()* @see     java.util.Hashtable#keys()* @see     java.util.Vector* @see     java.util.Vector#elements()public class Itbird{
public static void main(String[] args){Vector v = new Vector();v.addElement("my");v.addElement("you");Enumeration e = v.elements();//返回Enumeration对象while(e.hasMoreElements()){String value = (String)e.nextElement();//调用nextElement方法获得元素System.out.print(value);}}
}
http://www.lryc.cn/news/16292.html

相关文章:

  • git应用笔记(三)
  • 有序表的应用:设计一个增、删、查数据的时间复杂度均为O(logN)的结构
  • 离线环境拷贝迁移 conda envs 环境(蛮力方法,3行命令)
  • 【数据结构与算法】字符串1:反转字符串I 反转字符串II 反转字符串里的单词 剑指offer(替换空格、左旋转字符串)
  • 深入浅出C++ ——容器适配器
  • 电脑常用知识与工作常用工具
  • JS的事件循环
  • 【阿旭机器学习实战】【31】股票价格预测案例--线性回归
  • 浅谈毫米波技术与应用
  • 给安全平台编写插件模块的思路分享
  • 4123版驱动最新支持《霍格沃茨之遗》,英特尔锐炫显卡带你畅游魔法世界
  • OSI模型和网络协议简介
  • 传感器原理及应用期末复习汇总(附某高校期末真题试卷)
  • 【亲测2022年】网络工程师被问最多的面试笔试题
  • Web前端:全栈开发人员的责任
  • C语言之通讯录的实现
  • 手把手教大家在 gRPC 中使用 JWT 完成身份校验
  • VSCode远程连接服务器
  • 【C++】-- 异常
  • Java中的Stack与Queue
  • xilinx FPGA在线调试方法总结(vivado+ila+vio)
  • 自动化测试——css元素定位
  • ChatGPT可能马上取代你,这是它能做的十个工作
  • ubuntu转储coredump
  • 基于单片机的毕业设计推荐
  • APP测试中ios和androis的区别,有哪些注意点
  • 使用 Xcode 创建第一个 Objective-C 命令行程序 HelloWorld
  • 【蓝桥杯集训8】哈希表专题(3 / 3)
  • Java Scanner 类,超详细整理,适合新手入门
  • 干货 | 中小企业选型 Elasticsearch 避坑指南