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

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

image.png


image.png


image.png


我再把问题汇总一下,你瞟一眼就行,不用细读:


问题一:当集合大小等于2时,为什么删除第一个元素(公众号)可以正常执行,删除第二个元素(why技术)就会抛出异常呢?


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


问题三:为什么删除倒数第二个元素可以正常执行?删除倒数第二个元素以外的任意元素就会抛出异常?


问题四:为什么在删除完成之后立即break,则可以删除任意元素不会报错呢?


问题五:为什么注释掉判断语句直接remove(why技术)不会报错,而加上判断语句就报错了呢?


问题六:为什么判断"why技术"并remove的时候循环三次?为什么注释掉remove只循环两次?为什么判断"公众号"并remove的时候只循环一次?


晕不晕?


不要晕。上面我只是为了把各种情况都执行一下,然后截图出来,方便大家有个直观的理解。其实,上面的这六个问题,我在看来就只有两个问题:


1.当前循环会执行几次?


2.为什么会抛出异常?


而这两个问题中的第二个问题【为什么会抛出异常?】我已经在《这道Java基础题真的有坑!我求求你,认真思考后再回答。》这篇文章中进行了十分详尽的解答。所以,就不在这篇文章中讨论了。


那么,现在就只剩下一个问题了:当前循环会执行几次?


本文会围绕这个问题进行展开,当你明白这个问题后,上面的所有问题都迎刃而解了。


明确分析程序


我们就拿下面这个程序来进行分析:


image.png


我写文章之前,在Debug模式下碰到了一些不是程序导致的意外bug(我怀疑是jdk或idea版本的问题),我最后会讲一下,而且我觉得Debug模式也不太好对这个问题进行直观的文字描述,需要截取大量图片,这样不太方便阅读。所以为了更好的解释这个问题,更加方便大家阅读,我们先进行几个"骚"操作,对程序进行一下改造。


正如上图红色粗线框起来的代码所示。由于这个循环体循环几次是由while里面的条件hasNext()方法,即【cursor!=size】这个条件决定的。


hasNext()方法是ArrayList中一个叫做Itr内部类中的一个方法。


image.png


这里我们就不去编译一套JDK然后修改源码了,可以投机取个巧,和我之前的文章中说的一样,我们自定义一个ArrayList。


改造点一:自定义ArrayList


我们怎么自定义ArrayList呢?


首先,我们的需求是为了演示问题方便,但是我们的前提是得保证实验对象的一致性,换句话说就是:我们自定义的ArrayList需要和JDK的ArrayList的实现,一模一样,只是换个名称而已。


所以,我们直接把JDK的ArrayList拷贝一份出来并修改一个名字即可。


直接拷贝一个ArrayList过来后你发现会有报错的地方:


image.png


image.png


但是我觉得输出的日志还是不够清晰,直观。我想要直接输出当前是第几次循环,如下:


image.png


那我们怎么实现呢?这就是我们的第二个改造点了。


改造点二:自定义Iterator


要实现上面的日志输出我们很容易能想到第一个修改点,如下:


image.png


那怎么办呢?


你想啊,Iterator是一个接口,既然它没有这个方法,那我们也就自定义一个WhyIterator继承JDK的Iterator,然后在WhyIterator里面定义我们想要的接口即可:


image.png


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文件。