这道Java基础题真的有坑!我也没想到还有续集。 (3)

简介: 这道Java基础题真的有坑!我也没想到还有续集。 (3)

改造点三:一步一输出


这一个改造点,我就不进行详细说明了,授人以鱼不如授人以渔,前面两个改造点你如果会了,那你也能继续改造,得到下面的程序,并搞出一步一输出日志:


image.png


上面这图,就是我们最后需要分析的程序和日志了。


如果你对于得到上面的输出还是有点困难的话,你可以在文末找到我的git地址,我把程序都上传到了git上。


真相已经摆在眼前了


其实你想一想,还用分析吗?经过上面的三个"骚"操作后,真相已经摆在眼前了。


image.png


以这位读者的问题举例.


第一个问题:为什么判断"why技术"并remove的时候循环三次?


你品一品这个输出,这就是真相呀!为什么会循环三次,一目了然了啊!


【第1次循环】cursor=0,size=2,判定结果:true


【第1次循环】var3.next方法被调用cursor进行加一操作

 

【第2次循环】cursor=1,size=2,判定结果:true


【第2次循环】var3.next方法被调用cursor进行加一操作


【第2次循环】list.remove方法被调用size进行减一操作


【第3次循环】cursor=2,size=1,判定结果:true


image.png


再回答另外一个问题:为什么注释掉remove只循环两次?


你再品一品这个输出:


image.png


第三个问题:为什么判断"公众号"并remove的时候只循环一次?


继续品这个输出:


image.png


致命一问,灵魂一击


对于之前列举的其他问题,你有没有发现其实有很多共同的地方,但是我故意扰乱了你的判断,你仔细读这几个问题:


当集合大小等于2时,为什么删除第一个元素(公众号)可以正常执行?


当集合大小大于2时,删除第一个元素(公众号)也抛出了异常?


为什么删除倒数第二个元素可以正常执行?


上面的三个问题其实是在说一个问题,你发现了吗?


当集合大小等于2时第一个元素(公众号),是不是就是倒数第二个元素?!


恍然大悟有没有?


再看一个示例:


image.png


敲黑板,数学推理来了:


在单线程的情况下,只要你的ArrayList集合大小大于等于2(假设大小为n,即size=n),你删除倒数第二个元素的时候,cursor从0进行了n-1次的加一操作,size(即n)进行了一次减1的操作,所以n-1=n-1,即cursor=size。


因为判断条件返回为fales,虽然你的modCount变化了。但是不会进入下次循环,就不会触发modCount和expectedModCount的检查,也就不会抛出ConcurrentModifyException.


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中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
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文件。