当前位置:首页 > 科技  > 软件

你能说清楚For和Foreach有什么区别吗?

来源: 责编: 时间:2023-10-27 17:20:08 458观看
导读今天来分享一个小知识点,看看你能回答上来吗?在Java编程的世界里,for循环和foreach循环是两个常见的迭代结构,用于遍历数据集合或执行重复操作。然而,很多人常常混淆这两者,不清楚它们之间的区别,想用哪个就用哪个。今天我们

Dhi28资讯网——每日最新资讯28at.com

今天来分享一个小知识点,看看你能回答上来吗?Dhi28资讯网——每日最新资讯28at.com

在Java编程的世界里,for循环和foreach循环是两个常见的迭代结构,用于遍历数据集合或执行重复操作。然而,很多人常常混淆这两者,不清楚它们之间的区别,想用哪个就用哪个。今天我们就详细探讨下for循环和foreach循环的不同之处,帮助你理解它们的用途和适用场景,并提供一些示例来帮助你更好地掌握这两种循环。Dhi28资讯网——每日最新资讯28at.com

1、遍历元素

首先,上代码:
Integer[] array = {1,2,3};for(int i=0;i<array.length;i++){  System.out.println(array[i]);}List<Integer> list = new ArrayList<>();list.add(4);list.add(5);list.add(6);for(Integer i:list){  System.out.println(i);}

遍历后结果如下:Dhi28资讯网——每日最新资讯28at.com

123456

我们来看看编译后的代码:Dhi28资讯网——每日最新资讯28at.com

Integer[] array = new Integer[]{1, 2, 3};        for(int i = 0; i < array.length; ++i) {            System.out.println(array[i]);        }        List<Integer> list = new ArrayList();        list.add(4);        list.add(5);        list.add(6);        Iterator var3 = list.iterator();        while(var3.hasNext()) {            Integer i = (Integer)var3.next();            System.out.println(i);        }

数组使用的是原始的for循环,而集合使用的是iterator迭代器。Dhi28资讯网——每日最新资讯28at.com

2、删除元素

使用for循环:Dhi28资讯网——每日最新资讯28at.com

List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list.toString());for (int i = 0; i <list.size(); i++) {  list.remove("2");}System.out.println(list);

结果:Dhi28资讯网——每日最新资讯28at.com

[1, 2, 3][1, 3]

使用foreach:Dhi28资讯网——每日最新资讯28at.com

List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list.toString());for (String i : list) {  list.remove("2");}System.out.println(list.toString());

结果:Dhi28资讯网——每日最新资讯28at.com

[1, 2, 3]Exception in thread "main" java.util.ConcurrentModificationException	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)	at java.util.ArrayList$Itr.next(ArrayList.java:851)	at com.example.ForDemo.main(ForDemo.java:41)

直接报错!Dhi28资讯网——每日最新资讯28at.com

原因:

迭代器内部的每次遍历都会记录List内部的modcount当做预期值,然后在每次循环中用预期值与List的成员变量modCount作比较,但是普通list.remove调用的是List的remove,这时modcount++,但是iterator内记录的预期值=并没有变化,所以会报错。Dhi28资讯网——每日最新资讯28at.com

如果想要删除元素的话需要使用迭代器内部的remove方法:Dhi28资讯网——每日最新资讯28at.com

ArrayList<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list.toString());Iterator<String> it = list.iterator();while (it.hasNext()){  String next = it.next();  //if外使用list的remove方法还是会报错的  if(next.equals("2")){    //这里使用的是迭代器里面的remove()方法,    // 当然如果使用list的remove方法在此删除指定元素的话是也是可以成功的,比如:list.remove("2")    it.remove();  }}System.out.println(list.toString());

结果:Dhi28资讯网——每日最新资讯28at.com

[1, 2, 3][1, 3]

3、修改元素

使用for循环:Dhi28资讯网——每日最新资讯28at.com

List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list.toString());for (int i = 0; i <list.size(); i++) {  list.set(i,"4");}System.out.println(list.toString());

结果:Dhi28资讯网——每日最新资讯28at.com

[1, 2, 3][4, 4, 4]

没问题,可以修改元素;Dhi28资讯网——每日最新资讯28at.com

使用foreach:Dhi28资讯网——每日最新资讯28at.com

List<String> list = new ArrayList<>();list.add("1");list.add("2");list.add("3");System.out.println(list.toString());for (String i : list) {  i="4";}System.out.println(list.toString());

结果:Dhi28资讯网——每日最新资讯28at.com

[1, 2, 3][1, 2, 3]

没有变化,修改不了;Dhi28资讯网——每日最新资讯28at.com

修改元素不行,修改元素的属性行不行呢?让我们来看下吧。Dhi28资讯网——每日最新资讯28at.com

4、foreach修改元素属性

创建一个测试类:Dhi28资讯网——每日最新资讯28at.com

public class People {    private String name;    private Integer age;    public People(){    }    public People(String name, Integer age) {        this.name = name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public Integer getAge() {        return age;    }    public void setAge(Integer age) {        this.age = age;    }}

哦的k,接下来测试代码:Dhi28资讯网——每日最新资讯28at.com

People p1=new People("张三",20);People p2=new People("李四",21);List<People> peopleList=new ArrayList<>();peopleList.add(p1);peopleList.add(p2);System.out.println(p1.getName());System.out.println(p2.getName());for(People people:peopleList){  people.setName("王麻子");}System.out.println(p1.getName());System.out.println(p2.getName());

结果:Dhi28资讯网——每日最新资讯28at.com

张三李四王麻子王麻子

Amazing!这次成功了,修改不了对象,却可以修改对象的属性。Dhi28资讯网——每日最新资讯28at.com

总结

for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。foreach不可以删除/修改集合元素,而for可以foreach和for都可以修改元素里面的属性,所以相比较下来for循环更为灵活。Dhi28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15430-0.html你能说清楚For和Foreach有什么区别吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 亚马逊云计算业务Q3营收230亿美元 营收营业利润双双创下新高

下一篇: Next.js 14 正式发布,更快、更强、更可靠!

标签:
  • 热门焦点
  • 7月安卓手机性价比榜:努比亚+红魔两款新机入榜

    7月登场的新机有努比亚Z50S Pro和红魔8S Pro,除了三星之外目前唯二的两款搭载超频版骁龙8Gen2处理器的产品,而且努比亚和红魔也一贯有着不错的性价比,所以在本次的性价比榜单
  • 掘力计划第 20 期:Flutter 混合开发的混乱之治

    在掘力计划系列活动第20场,《Flutter 开发实战详解》作者,掘金优秀作者,Github GSY 系列目负责人恋猫的小郭分享了Flutter 混合开发的混乱之治。Flutter 基于自研的 Skia 引擎
  • 一篇聊聊Go错误封装机制

    %w 是用于错误包装(Error Wrapping)的格式化动词。它是用于 fmt.Errorf 和 fmt.Sprintf 函数中的一个特殊格式化动词,用于将一个错误(或其他可打印的值)包装在一个新的错误中。使
  • 分享六款相见恨晚的PPT模版网站, 祝你做出精美的PPT!

    1、OfficePLUSOfficePLUS网站旨在为全球Office用户提供丰富的高品质原创PPT模板、实用文档、数据图表及个性化定制服务。优点:OfficePLUS是微软官方网站,囊括PPT模板、Word模
  • ESG的面子与里子

    来源 | 光子星球撰文 | 吴坤谚编辑 | 吴先之三伏大幕拉起,各地高温预警不绝,但处于厄尔尼诺大&ldquo;烤&rdquo;之下的除了众生,还有各大企业发布的ESG报告。ESG是&ldquo;环境保
  • 东方甄选单飞:有些鸟注定是关不住的

    文/彭宽鸿编辑/罗卿东方甄选创始人俞敏洪带队的&ldquo;7天甘肃行&rdquo;直播活动已在近日顺利收官。成立后一年多时间里,东方甄选要脱离抖音自立门户的传闻不绝于耳,&ldquo;7
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 华为发布HarmonyOS 4:更好玩、更流畅、更安全

    在8月4日的华为开发者大会2023(HDC.Together)大会上,HarmonyOS 4正式发布。自2019年发布以来,HarmonyOS一直以用户为中心,经历四年多的发展HarmonyOS已
  • 苹果、三星、惠普等暂停向印度出口笔记本和平板电脑

    集微网消息,据彭博社报道,在8月3日印度突然禁止在没有许可证的情况下向印度进口电脑/平板及显示器等产品后,苹果、三星电子和惠普等大公司暂停向印度
Top