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

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

本文目录


一.题是什么题?


二.阿里Java开发规范。


   2.1 正例代码。


   2.2 反例代码。


三.层层揭秘,为什么发生异常了呢?


   3.1 第一层:异常信息解读。


   3.2 第二层:抛出异常的条件解读。


   3.3 第三层:什么是modCount?它是干啥的?什么时候发生变化?


   3.4 第四层:什么是expectedModCount?它是干啥的?什么时候发生变化?


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


四.这题的坑在哪?


   4.1 回头再看。


   4.2 还有一个骚操作。


五.线程安全版的ArrayList。


六.总结一下。


七.回答另外一个面试题。


八.扩展阅读。


    7.1 fail-fast机制和safe-fast机制。


    7.2 Java语法糖。


    7.3 阿里Java开发手册。


一.题是什么题?


我第一次遇到这个题的时候,是在一个微信群里,阿里著名的"Java劝退师"小马哥抛出了这样的一个问题:


image.png


然后大家纷纷给出了自己的见解(注:删除了部分聊天记录):


后面在另外的群里聊天的时候(注:删除了部分聊天记录),我也抛出了这样的问题:


总结一下图片中的各种回答:


1.什么也不会发生,remove之后,list中的数据会被清空。

2.remove的方法调用错误,入参应该是index(数组下标)。

3.并发操作的时候会出现异常。

4.会发生ConcurrentModifyException。


你的答案又是什么呢?


在这里,我先不说正确的答案是什么,也先不评价这些回答是对是错,我们一起去探索真相,寻找答案。


二.阿里Java开发规范


有人看到题的第一眼(没有认真读题),就想起了阿里java开发手册(先入为主),里面是这样说的:


image.png


正是因为大多数人都知道并且读过这个规范(毕竟是业界权威)。所以呼声最高的答案是【会发生ConcurrentModifyException】。因为他们知道阿里java开发手册里面是强制要求:

不要在foreach循环里面进行元素的remove/add操作。remove元素请使用Iterator方式,如果并发操作,需要对Iterator对象加锁。

但是不能因为他是权威,我们就全盘接受吧?

2.1 正例代码


所以我们眼见为实,先把手册里面提到的【正例代码】跑一下,如下:


image.png


image.png


从上面我们可以得到一个结论.......


等等,到这一步你就想得到结论了?你不对【一行代码为什么就替换了七行代码】好奇吗?


看到真相的时候,有时候再往前一步就是本质了。


源码之下无秘密,我再送你一张图,JDK1.8中Collection.removeIf的源码:


image.png


好了,已经到源码级别了,从这里我们验证了,阿里java开发手册里面的正例是对的,而且我还想给他加上一句:


如果你的JDK版本是1.8以上,没有并发访问的情况下,可以使用


Collection.removeIf(Predicate<? super E> filter)方法。使代码更加优雅。


2.2 反例代码


接下来我们看看【反例代码】的运行结果:


image.png


从执行结果来看,和我们预期的结果是一致。看着没有问题呀?

但是你别忘了,下面还有一句话啊:


image.png


image.png


把删除元素的条件从【公众号】修改为【why技术】就发生了异常:


java.util.ConcurrentModificationException

目录
相关文章
|
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中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
83 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
6月前
|
Java
【Java基础】输入输出流(IO流)
Java基础、输入输出流、IO流、流的概念、输入输出流的类层次结构图、使用 InputStream 和 OutputStream流类、使用 Reader 和 Writer 流类
174 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流和常见面试题(二)
42 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文件。