范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

竟然有一半的人不知道for与foreach的区别?

  之前有一个同事突然我问了我一个问题,说在foreach当中能不能删除list里面的元素,我当时大概说了一下是否能删除,以及原因;接下来我们来探讨一下是否能够如此: (1)遍历元素
  首先,我们以一段代码为例: String[] array = {"1", "2", "3"}; for (String i : array) {     System.out.println(i); }  ArrayList list = 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); }  ArrayList list = 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循环:ArrayList list = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (int i = 0; i  list = 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方法: ArrayList list = 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:ArrayList list = new ArrayList<>(); list.add("111"); list.add("222"); list.add("333"); log.info(list.toString()); for (int i = 0; i  list = 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");         List studentList=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 jingtian
  484很神奇!修改不了对象,却可以修改对象的属性。 总结for与foreach都可以遍历数组/集合,不过for则在较复杂的循环中效率更高。 foreach不可以删除/修改集合元素,而for可以 foreach和for都可以修改元素里面的属性
  所以相比较下来for循环更为灵活。
  来源:blog.csdn.net/qq_40521656/article/details/90749927

315观点野蛮生长的第三方测评亟待法治化规范化,有关部门应加强对第三方测评机构的监管,切实填补监管盲区,真正让消费者对第三方测评放心。该选哪个品牌?产品使用感如何?随着移动互联网普及和电商平联发科稳了!移动芯片性能榜出炉,天玑9000拿下安卓第一在过去很多年里,说起安卓旗舰手机,很多人都会下意识地认为这款手机搭载了高通骁龙8系列处理器,虽然骁龙8系列的综合表现不如苹果A系列,但完胜联发科和三星还是很轻松的。骁龙8系列处理器文萃算法权力探析来源读特编者按数字经济时代,算法的应用和发展对社会经济运行产生了深刻影响,在一定程度上解决了人们的认知偏差,提升了决策精准程度,促进了公共治理与经济运行效率,但同时也引发了算法共谋王煜全你好,我是王煜全,这里是王煜全要闻评论。最近俄乌战争中,西方国家的各种制裁行动大大超出了大家的想象。先是断开SWIFT国际结算系统,这种号称是金融核武器的大招儿都用上了接着是众多跨你想要的它都有!多款机型曝光,4月份将是蓝厂发布会月今天蓝厂官方发布了一则关于折叠屏的信息,由此引发出了蓝厂下个月的众多产品信息!我们一起来盘点一下vivo首款折叠屏手机vivoXFold,外屏尺寸为6。53英寸,三围为162。01中外人才陆续汇聚到中国中国国运来了,华为总裁任正非的预言成真啦。美国坐不住了,就在最近,一股科技人才的回归浪潮开始掀起,一批批的顶尖科学家已经弃美回国了。前微软总裁李开复率先放弃美国绿卡和美国开出的优厚先别着急给微信视频号下定义新眸大企业研究组作品作者叶静编辑桑明强今年的微信公开课上,视频号站到了C位。这并不是腾讯第一次重金押注短视频。4年前,短视频热潮席卷互联网,抖音快手各自占山为王,腾讯重启了微视并改重新认识二创好的二创和作品是相辅相成的。用短视频的平台流量,来进一步助推更多优质长视频的出圈发酵。作者小满编辑原野微信公众号略大参考(IDhyzibenlun)二创,后现代主义催生的必然产物。企业管理软件是否能够真正的帮助高层管理企业?合适的系统应该是很好的管理帮手当公司发展越来越大,逐步走向规范的过程中,公司就会出现很多高频重复持续性流程化固定化的事务。这些数据,是可以通过软件和系统进行管理的。所以我们经常都会三星今年可能推出第三个折叠屏产品系列到目前为止,三星已推出GalaxyZFold和ZFlip两个折叠屏产品系列。国外数码论坛的一份报告表明,可能会有第三个折叠屏产品正在筹备中。按更新规律看,ZFold4和ZFlip42千元价位,RedmiK50和真我GTNeo3该怎么选?听我的准没错近期,各大手机厂商陆续推出了一批新机,既有搭载新一代高通骁龙8的机型,也有搭载天玑年度旗舰双芯的机型。虽然说,往年天玑的口碑都不如高通,但从今年行业形势来看,天玑或许将凭借天玑90
买苹果之前你得知道这些虽然苹果在人群中中很受欢迎,但我建议你买之前问问自己能不能接受苹果那些问题,想好了再买也不迟。iPhone信号不好一直是个硬伤。之前传言iPhone信号不好主要是采用了猪队友int机如其人,请查收渣女图鉴手册谁曾见过渣女?你我都不曾。但当无知少男落泪,就知渣女来过。今天就来盘盘那些渣女最喜欢用的手机,iPhone12当之无愧,誉为榜首。iPhone12外观从整体上看它和iPhone5差别再盯着丰田普拉多不放了,福特全新硬派SUV即将换代说起硬派越野,我想大家首先会想到奔驰G级jeep牧马人丰田普拉多日产途乐等,它们可以说是其中的佼佼者,深受消费者的喜爱,不过除了它们以外,还有不少的经典可以选择,比如今天的主角福特林肯冒险家MONO限量版正式上市,豪华SUV的另一种选择说起豪华品牌,我们第一时间会想到宝马奔驰奥迪,毕竟它们可以说是其中的标杆,深受消费者的喜爱。不过除了它们以外,还有不少的经典可以选择,比如今天的主角林肯冒险家MONO限量版,新车全国内首例氢燃料电池汽车示范城市群获批,我的家乡也在其中都知道未来是新能源汽车的天下,大众本田丰田现代等全球知名车企都开始往电气化转型,而豪华品牌也是如此,可见传统燃油车时代已经开始慢慢终结。不过相比纯电汽车而言,氢燃料汽车才是真正的新同行不再是冤家,大众福特领导人大赞特斯拉俗话说得好,同行是冤家,就连汽车界也是如此,但近期出现的事情却打破了传统认知,大众首席执行官赫伯特迪斯和福特首席执行官吉姆法利同时出现在公众面前,并且大肆赞美特斯拉,并对马斯克对电芯片短缺引发二手车市怪象奔驰宝马发票价回购二手车芯片短缺这个问题终于蔓延到二手车市场了,别以为这是开玩笑,国内奔驰跟宝马多家4S店已经开始有针对性地回收二手车,而且只要是在条件范围内的都以开票价回收,请注意,这不是开玩笑!现在江打字幕本身是个累人的技术活,如今点几下鼠标就搞定了大家好我是T哥。曾经,有个叫字幕组的东西,听起来他们干的活很简单,就是给视频加上字幕,实际上,以前给视频加字幕,跟如今比起来,就是一个技术活。你得会字幕软件,得会时间轴。而早期的字主打年轻与智能,哈弗H6S将于成都车展开启预售在成都车展前夕,哈弗开启了荣耀十周年全球粉丝庆典活动,而哈弗H6S也将在成都车展开启预售,预售价为13。8916。49万元,新车主打年轻智能,可以说是哈弗今年的一大力作,话不多说,苹果聘请两名前奔驰工程师加入苹果汽车泰坦项目组都知道未来是新能源汽车的天下,大众本田丰田现代等全球知名车企都开始往电气化转型,而其他领域也抓住了这个机会,想在新能源汽车市场大展拳脚,其实比较出名的有小米跟苹果,今天咱就来说说苹福特正式往电气化转型,探险者纯电版将于2023年亮相都知道未来是新能源汽车的天下,大众本田丰田现代等全球知名车企都开始望电气化转型,而我们自主品牌也是如此,可见传统燃油车时代已经开始慢慢终结。而福特作为美系中的老大哥,也正式宣布全球