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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CPU流水线技术演进「建议收藏」

    CPU流水线技术演进「建议收藏」一.三级线性流水线每个流水级的结构是:逻辑电路+寄存器我们可以将流水线往下细分,使得各个流水级足够小(CPU执行时间少),就可以通过提高系统时钟频率来提高CPU的处理速度。二.多级线性流水线(这里以5级为例)注意:我们把5级以上的流水线称为超流水线结构。三.muti-多级线性流水线(这里以5级为例)四.多级非线性流水线(乱序执行部件)五.超线程处理器多级非线性流水线(虚拟处理器共用乱序执行部件)拥有超线程的处理器将两个虚拟的处理器暴露给共享的乱..

    2022年8月20日
    6
  • 多进程 python_Python 多进程

    多进程 python_Python 多进程进程前置知识点进程:一个程序运行起来后,代码+用到的资源称之为进程,它是操作系统分配资源的基本单元。并发:指的是任务数多余cpu核数,通过操作系统的各种任务调度算法,实现用多个任务“一起”执行

    2022年7月30日
    8
  • 培根密码解密_密码学解密

    培根密码解密_密码学解密密码学真的是一门很神奇的课程。 培根密码,简单的说说原理吧。就是类似于二进制0,1的套路,但是是用A,B来替代的。类如26字母表可以如下写:大写:AaaaaaBaaaabCaaabaDaaabbEaabaaFaababGaabbaHaabbbIabaaaJabaabKababaLababbMabbaa…

    2025年6月30日
    5
  • 越权访问漏洞总结

    越权访问漏洞总结一、平行越权攻击者请求操作(增删改查)某条数据时,web应用程序没有判断该条数据的所属人,或者在判断数据所属人时直接从用户提交的表单参数中获取,例如用户id等,导致攻击者可以自行修改参数,操作获取不属于自己的数据。测试方法:在发送请求时观察请求参数,尝试修改用户id或者其他参数验证是否能查看不属于自己的数据,进行增删改查,若成功则存在平行越权的漏洞。 二、纵向越权和平行越权相似…

    2022年6月17日
    39
  • 如何用cmd查看端口占用情况「建议收藏」

    如何用cmd查看端口占用情况「建议收藏」转载于:https://www.cnblogs.com/HuiLove/p/3921945.html

    2022年5月12日
    43
  • pycharm激活码2017_最新激活码没有过期的

    pycharm激活码2017_最新激活码没有过期的pyCharm最新2018激活码点这里

    2022年8月27日
    6

发表回复

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

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