Java中的for循环问题

今天编写程序时遇到了一个bug,经过漫长的调试,终于找出了问题所在。

下面是测试代码:

import java.util.ArrayList;
import java.util.List;

public class Test {

    public static void main(String[] args) {
        List<String> strings = new ArrayList<>();
        String str1 = "String1";
        String str2 = "String2";
        strings.add(str1);
        strings.add(str2);
        
        //输出列表中的元素内容
        for (int i = 0; i < strings.size(); ++i) {
            System.out.println(i + ":" + strings.get(i));
        }
        
        System.out.println("--------");
        
        //测试在for循环中往列表添加元素时,输出的内容
        for (int i = 0; i < strings.size(); ++i) {
            System.out.println(i + ":" + strings.get(i));
            if (i == 0) {
                strings.add("String3");
            }
        }
        
        System.out.println("--------");
        
        //输出列表中的元素内容
        for (int i = 0; i < strings.size(); ++i) {
            System.out.println(i + ":" + strings.get(i));
        }
        
        System.out.println("--------");
        
        //测试在循环中删除列表元素时,输出的内容
        for (int i = 0; i < strings.size(); ++i) {
            System.out.println(i + ":" + strings.get(i));
            if (i == 0) {
                strings.remove(str1);
            }
        }
    }

}

运行结果如下所示:

0:String1
1:String2
--------
0:String1
1:String2
2:String3
--------
0:String1
1:String2
2:String3
--------
0:String1
1:String3

程序一开始,创建了ArrayList列表,并向列表中添加了两个String字符串,然后输出列表中的元素内容。

接着,测试当在for循环中往列表添加元素并输出时,会发生什么事情。结果,程序并没有如我想象的那样,只输出前两个元素,而是将三个元素全部输出。

然后,再次输出修改后列表的元素内容。

最后,测试当在for循环中从列表移除元素并输出时,会发生什么事情。结果,程序没有产生越界异常,而只是少输出了一个元素——String3。

通过对此测试程序的分析,发现我忽视了一个细节:for循环判断语句后面的strings.size()在每次循环时都会重新执行,从而重新得到列表的大小,然后进行比较。所以,当在第一次循环中添加新元素时,这个新元素仍然可以得到遍历;当在第一次循环中删除元素时,此元素的下一个元素会替补此元素的位置,导致下一元素不会得到遍历,并且,当遍历到最后一个元素时,会结束循环。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 2,943评论 0 8
  • 一、基础知识:1、JVM、JRE和JDK的区别:JVM(Java Virtual Machine):java虚拟机...
    杀小贼阅读 2,416评论 0 4
  • 四、集合框架 1:String类:字符串(重点) (1)多个字符组成的一个序列,叫字符串。生活中很多数据的描述都采...
    佘大将军阅读 775评论 0 2
  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 4,083评论 0 0
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,467评论 0 5