遍历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);

}

java .foreach数组遍历_foreach遍历ArrayList和数组相关推荐

  1. java中的LinkedList(链表)与ArrayList(动态数组):(1)简单辨析

    一.数组的缺点(为什么需要引入JAVA集合): 数组不是面向对象的,存在明显的缺陷,集合弥补了数组的缺点,比数组更灵活更实用,而且不同的集合框架类可适用不同场合. 首先数组可以存放基本数据类型和对象, ...

  2. java中的LinkedList(链表)与ArrayList(动态数组):(2)尝试简单实现LinkedList

    一.对于LinkedList需要方法的简单分析 从简图中可以看出,要完成对链表的简单实现,首先应先具有一个用于创造节点对象的Node类,在Node类中应至少具有两个属性: (1).用于保存本节点数据的 ...

  3. String转List,String转数组,List转ArrayList,数组转List

    String转List private List<String> strings; strings = Arrays.asList(dataBean.getImgs().split(&qu ...

  4. JAVA如何遍历arraylist数组,Java 程序使用Lambda表达式遍历ArrayList

    Java 程序使用Lambda表达式遍历ArrayList 在此示例中,我们将学习在Java中使用lambda表达式遍历数组列表的每个元素. 要理解此示例,您应该了解以下Java编程主题: 示例:将A ...

  5. java遍历之数组遍历,list遍历,set遍历,map遍历,stream遍历,Enumeration遍历

    1._遍历方式 其实遍历的就两种,对象和数组.只是哪个遍历适用于哪个而已 for for增强 foreach 迭代(Iterable) Arrays.toString 2._数组遍历 package ...

  6. java数组遍历最快方式_java数组遍历的方法

    对于数组来说,基本上可以看做是一些数字.我们在使用字符串的时候,有过遍历的操作,那么对应的数组也能够进行遍历.这里为大家整理了三种遍历的方法.for循环.foreach.toString(),第二种可 ...

  7. java arraylist 遍历_java集合ArrayList的三种遍历方式

    ArrayList ArrayList 使用连续的内存单元存储数据元素,是一个其容量能够动态增长的动态数组. 当添加或删除数据元素时(最后位置除外),ArrayList 需要移动其被添加(或删除)元素 ...

  8. 【Android NDK 开发】JNI 方法解析 ( 字符串数组参数传递 | 字符串遍历 | 类型强转 | Java 字符串与 C 字符串转换 | 字符串释放 )

    文章目录 I . C/C++ 中的 Java 字符串数组类型 II . 获取字符串数组长度 III . 获取字符串数组元素 IV . 类型强转 ( jobject -> jstring ) V ...

  9. js中数组过滤、遍历、迭代every、some、filter、map、forEach、reduce、reduceRight

    全栈工程师开发手册 (作者:栾鹏) js系列教程1-数组操作全解 js中数组过滤.遍历.迭代 数组的过滤.遍历.迭代操作中 1.过滤为将满足条件的元素筛选出来,返回数组 2.遍历为分别计算每一个元素值 ...

最新文章

  1. pyspider爬虫学习-文档翻译-About-Projects.md
  2. TortoiseSVN SendRpt.exe not found解决方案
  3. 0109互联网新闻 | 微信推智言对话系统“小微”,接入第三方生态;华为发布首款数据中心交换机...
  4. django2.2连接mysql遇到的坑(亲测)
  5. Redis(1) 简介以及linux环境下的安装
  6. android p dp5,谷歌释出Android P第5个开发者预览版更新!
  7. 嵌入式全栈工程师_我花了半个月,整理出了这篇嵌入式开发学习指南(学习路线+知识点梳理)...
  8. dubbo的端口地址和ip写在那_开源一款超实用的 Dubbo 测试工具,已用半年,感觉很有feel~...
  9. python 类不实例化方法:@staticmethod或@classmethod
  10. 【IT】使用gdb调试code
  11. kali linux无法启动服务,不好了!出问题了!在安装Kali Linux之后启动系统时
  12. 【机器学习】隐马尔可夫模型及其三个基本问题(一)
  13. pandas之Dataframe 菜鸟教程
  14. 添加key_所写为方便日后查阅(添加SSHkey)
  15. kuangbin最短路 模板
  16. RouterOS之DDNS(动态域名)
  17. 固态硬盘打开计算机就死机,SSD固态硬盘死机卡顿无响应怎么办?SSD卡顿故障处理教程 | 麦田一棵葱...
  18. 时序违例的原因及其解决办法
  19. 柏力纪德:网店开店之后怎么运营
  20. 怎么获取api key?

热门文章

  1. java pcm转adpcm_android adpcm,pcm转换封装
  2. 英特尔问题产品可无条件退换 或致硬盘光驱失灵
  3. PCB厂甩铜常见的原因分析
  4. 怎么用cmd进入远程服务器,如何使用cmd和telnet远程服务器?
  5. 准静态油驱水水驱油4m4
  6. js保留小数位数,四舍五入和非四舍五入
  7. 要学习的内容 (一)
  8. 1.02亿美元从数字资产基金撤出!BTC价格已经触底!预示下跌趋势即将逆转?
  9. MyBatis Generator中的新功能
  10. 2.Libgdx扩展学习之Box2D_刚体和形状