java .foreach数组遍历_foreach遍历ArrayList和数组

java .foreach数组遍历_foreach遍历ArrayList和数组遍历ArrayList的方式有迭代器,foreach循环,get(i)等方式。其中迭代器和get方法都有具体的代码可以看到。foreach循环是怎么实现的呢?下面通过反编译class的方式来看看JAVA是如何处理foreach遍历ArrayList、数组的。先说结论:foreach遍历list底层还是使用的迭代器;foreach遍历数组还是传统的i=0到i=length-1遍历,只是写法上封装成f…

大家好,又见面了,我是你们的朋友全栈君。

遍历ArrayList的方式有迭代器,foreach循环,get(i)等方式。其中迭代器和get方法都有具体的代码可以看到。foreach循环是怎么实现的呢?

下面通过反编译class的方式来看看JAVA是如何处理foreach遍历ArrayList、数组的。

先说结论:foreach遍历list底层还是使用的迭代器;foreach遍历数组还是传统的i=0到i=length-1遍历,只是写法上封装成foreach的形式

拓展:foreach遍历list时不能调用remove方法的原因

因为迭代器遍历过程中,不允许list被修改(删除、增加元素),具体做法是在迭代器对象中记录迭代器生成时list的modCount字段。在调用next时回去校验迭代器保持的expectedModCount是不是和list的modCount相等,不相等的话就会抛出异常ConcurrentModificationException。所以使用foreach循环时不能删除list元素,也不能添加(也会改变modCount)。若要在遍历过程中进行删除可以使用迭代器遍历法,并使用iterator.remove()方法,这儿方法会删除上次刚next()跳过的元素,不能在调用next前调用,否则也会抛异常IllegalStateException。

原始代码

List list = new ArrayList();

for(int i = 0; i < 10; i++)

list.add(i);

for (Integer i : list) {

System.out.println(i);

}

int[] arr = {1,2,3,4,5};

for (int i : arr) {

System.out.println(i);

}

先将上述代码编译为class,再反编译得到:

Iterator var7 = var1.iterator();

while(var7.hasNext()) {

Integer var3 = (Integer)var7.next();

System.out.println(var3);

}

int[] var8 = new int[]{1, 2, 3, 4, 5};

int[] var9 = var8;

int var4 = var8.length;

for(int var5 = 0; var5 < var4; ++var5) {

int var6 = var9[var5];

System.out.println(var6);

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163094.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Mysql5.7在忘记密码的情况下如何修改密码?

    Mysql5.7在忘记密码的情况下如何修改密码?

    2021年10月19日
    34
  • MIME协议详解「建议收藏」

    MIME协议详解「建议收藏」                  MIME结构一、   RFC822协议RFC822文档定义了邮件内容的主体结构和各种邮件头字段的详细细节,但是,它没有定义邮件体的格式,RFC822文档定义的邮件体部分通常都只能用于表述一段普通的文本,而无法表达出图片、声音等二进制数据。另外,SMTP服务器在接收邮件内容时,当接收到只有一个“.”字符的单独行时,就会认为邮…

    2022年4月20日
    62
  • 金蝶java开发(金蝶中间件 开源)

    面试的是java开发岗1.首先是做一份笔试题,笔试题比较简单,主要是设计模式,sql查询,linux命令2.面试分3轮第一轮:1个面试官,总体答得还行比较全面的技术面试,包括了(1)jvm内存模型:堆栈,方法区,程序计数器,本地方法区,以及他们各种的作用(2)jvm垃圾回收算法:复制算法,标记-清除,标记-整理,以及他们使用的场景和大致的作用1)多线程:synchron…

    2022年4月15日
    168
  • 单片机入门到高级开挂学习路径(附教程+工具)[通俗易懂]

    单片机入门到高级开挂学习路径(附教程+工具)[通俗易懂]一、先帮大家解答几个问题:1.单片机是什么?答:单片机就是一个微型CPU,把程序烧录芯片里面,通过控制不同的外围电路实现不同产品的功能。2.学单片机编程对数学英语有要求吗?答:数学会基本的加减乘除就行,英语会认单词a-z就行,很多外行人看到代码里一堆英文就头嗡嗡响,其实不然,只有少数语法是固定的,大多数英文都是工程师自己定义的,比如大神你也可以定义成DaShen(中文缩写)。那很多人此时就开始质疑,当初这么辛苦学数学和英语到底是为毛?数学和英语不是单片机开发的门槛,但却决定你以后能达到的高度,

    2022年6月10日
    60
  • 几种常见的损失函数「建议收藏」

    几种常见的损失函数「建议收藏」1.损失函数、代价函数与目标函数  损失函数(LossFunction):是定义在单个样本上的,是指一个样本的误差。  代价函数(CostFun

    2022年6月30日
    33
  • 微信开发者工具报错,提示 未找到入口 app.json 文件

    微信开发者工具报错,提示 未找到入口 app.json 文件微信开发者工具报错,提示 未找到入口 app.json 文件

    2022年4月24日
    86

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号