Java中for与foreach的区别是什么
来源:亿速云
时间:2024-04-04 17:45:32 307浏览 收藏
今日不肯埋头,明日何以抬头!每日一句努力自己的话哈哈~哈喽,今天我将给大家带来一篇《Java中for与foreach的区别是什么》,主要内容是讲解等等,感兴趣的朋友可以收藏或者有更好的建议在评论提出,我都会认真看的!大家一起进步,一起学习!
(1)遍历元素
首先,我们一一段代码为例:
String[] array = {"1", "2", "3"}; for (String i : array) { System.out.println(i); } ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); for (String i : list) { System.out.println(i); }
遍历后结果如下:
1
2
3
111
222
333
结果毫无疑问。
我们再来看看编译后的源码(idea自带,在target包里打开你的类源码文件即可):
String[] array = new String[]{"1", "2", "3"}; String[] var2 = array; int var3 = array.length; for(int var4 = 0; var4 < var3; ++var4) { String i = var2[var4]; System.out.println(i); } ArrayListlist = new ArrayList(); list.add("111"); list.add("222"); list.add("333"); Iterator var7 = list.iterator(); while(var7.hasNext()) { String i = (String)var7.next(); System.out.println(i); }
可见,遍历数组使用的是原始for循环,集合的话使用的是Iterator迭代器。
(2)删除元素
哦的k!接下来我们来删除元素:
使用for循环:
ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (int i = 0; i 结果:
11:11:52.532 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
11:11:52.539 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333]显然成功!
使用foreach:ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (String i : list) { list.remove("222"); } log.info(list.toString()); 结果:
11:50:48.333 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.xiaolinge.com.hello.HelloWord.main(HelloWord.java:30)显然木有成功!
原因:
迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。
如果想要删除元素的话需要使用迭代器内部的remove方法:ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); Iterator it = list.iterator(); while (it.hasNext()){ String next = it.next(); //if外使用list的remove方法还是会报错的 if(next.equals("222")){ it.remove();//这里使用的是迭代器里面的remove()方法, // 当然如果使用list的remove方法在此删除质地感元素的话是成功的,比如:list.remove("222") } } log.info(list.toString()); 结果:
12:06:14.042 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:06:14.046 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 333](3)修改元素
使用原始for:
ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (int i = 0; i 结果:
12:12:56.910 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:12:56.915 [main] INFO com.xiaolinge.com.hello.HelloWord - [444, 444, 444]哦的k!可以修改元素;
使用foreach:
ArrayListlist = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (String i : list) { i="444"; } log.info(list.toString()); 结果:
12:34:47.207 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]
12:34:47.211 [main] INFO com.xiaolinge.com.hello.HelloWord - [111, 222, 333]看到咯,不行的哦。
辣么,修改元素不行,修改元素的属性可不可以呢?让我们来看下吧。(4)foreach修改元素属性
(for就不测试了)
创建一个学生类:
public class Student { private int age; public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } private String name; public Student(){}; public Student(int age,String name){ this.age=age; this.name=name; } }哦的k,接下来测试代码:
Student student=new Student(1,"huge"); Student student1=new Student(1,"xiaoyao"); ListstudentList=new ArrayList (); studentList.add(student); studentList.add(student1); System.out.println(student.getName()); System.out.println(student1.getName()); for(Student stu:studentList) { stu.setName("jingtian"); } System.out.println(student.getName()); System.out.println(student1.getName()); 结果:
huge
xiaoyao
jingtian
jingtian484很神奇!修改不了对象,却可以修改对象的属性。
文中关于java,for,foreach的知识介绍,希望对你的学习有所帮助!若是受益匪浅,那就动动鼠标收藏这篇《Java中for与foreach的区别是什么》文章吧,也可关注golang学习网公众号了解相关技术文章。
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
487 收藏
-
289 收藏
-
115 收藏
-
440 收藏
-
231 收藏
-
213 收藏
-
348 收藏
-
381 收藏
-
405 收藏
-
169 收藏
-
328 收藏
-
270 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习