这道Java基础题真的有坑!我求求你,认真思考后再回答。 (3)

简介: 这道Java基础题真的有坑!我求求你,认真思考后再回答。 (3)

3.5 第五层:组装线索,直达真相


为什么发生了异常呢?


如果说前四层是线索的话,真相其实已经隐藏在线索里面了。我带你梳理一下:


【第一层:异常信息解读】中说到



image.png


image.png


image.png


image.png


image.png


image.png


image.png


总结一下在foreach循环里面进行元素的remove/add操作抛出异常的真相:


因为foreach循环是Java的语法糖,经过编译后还原成了迭代器。


但是从经过编译后的代码的第26行可以看出,remove方法的调方是list,而不是迭代器。


经过前面的源码分析我们知道,由于ArrayList的"fail-fast"机制,调用remove方法会触发【modCount++】操作,对expectedModCount没有任何操作。只有调用迭代器的remove方法,才会维护expectedModCount=modCount。


所以调用了list的remove方法后,再调用Itr的next方法时,导致了expectedModCount!=modCount,抛出异常。


四.这题的坑在哪里?


前面讲了阿里开发手册。讲了在foreach循环里面进行元素的remove/add为什么会发生异常。有了这些铺垫之后。


4.1 回头再看


我们再回过头来看小马哥出的这个题:


image.png


我靠,这乍一看,foreach循环里面调用list.remove(obj)。我们刚刚分析过,会抛出ConcurrentModificationException异常。


你要这样答,你就进了小马哥的坑了。


这个题的坑在这三个点里面。小马哥并没有说这个list是ArrayList吧?如果你没有认真审题,先入为主的默认了这个list就是ArrayList。第一步就错了。


这是真正的高手,借力打力。借阿里开发手册的力,让你第一步就走错。


image.png


当使用CopyOnWriteArrayList的时候,程序正常执行。


4.2 还有一个骚操作


既然我们知道为什么会抛出异常,也知道怎么不抛出异常,List本来就是一个接口,那我们是不是可以实现这个接口,弄一个自定义的List呢?


比如下面的这个WhyTechnologyList,就是我自己的List,狸猫换太子,这操作,够"骚"啊。


image.png

目录
相关文章
|
7月前
|
存储 缓存 Java
最新Java基础系列课程--Day10-IO流文件处理
最新Java基础系列课程--Day10-IO流文件处理
|
7月前
|
存储 Java
最新Java基础系列课程--Day10-IO流文件处理(一)
最新Java基础系列课程--Day10-IO流文件处理
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
86 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
6月前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
181 2
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
6月前
|
安全 Java
|
6月前
|
搜索推荐 算法 Java
【Java基础】 几种简单的算法排序
几种简单的JAVA算法排序
54 4
|
6月前
|
存储 缓存 Java
Java基础17-读懂Java IO流和常见面试题(二)
Java基础17-读懂Java IO流和常见面试题(二)
45 0
|
6月前
|
存储 Java Unix
Java基础17-读懂Java IO流和常见面试题(一)
Java基础16-读懂Java IO流和常见面试题(一)
77 0
|
7月前
|
Java
Java基础教程(12)-Java中的IO流
【4月更文挑战第12天】Java IO涉及输入输出,包括从外部读取数据到内存(如文件、网络)和从内存输出到外部。流是信息传输的抽象,分为字节流和字符流。字节流处理二进制数据,如InputStream和OutputStream,而字符流处理Unicode字符,如Reader和Writer。File对象用于文件和目录操作,Path对象简化了路径处理。ZipInputStream和ZipOutputStream则用于读写zip文件。