当前位置: 首页 > news >正文

学做淘宝网站是骗子吗灰色行业推广平台网站

学做淘宝网站是骗子吗,灰色行业推广平台网站,优化网站排名方法,怎么在一起做网站上拿货前天看到一篇文章什么?for循环也会出问题?,里面涉及到在for循环中修改集合,想起来自己刚入行的时候就碰到过类似的问题,于是复现了一下文章中的问题,并试验了其它在循环中修改集合的方法。 底层原理参考什…

前天看到一篇文章什么?for循环也会出问题?,里面涉及到在for循环中修改集合,想起来自己刚入行的时候就碰到过类似的问题,于是复现了一下文章中的问题,并试验了其它在循环中修改集合的方法。

底层原理参考什么?for循环也会出问题?这篇文章的分析

1. 在fori中修改集合

  • 在fori中修改集合,不会抛出异常
  • 在fori中移除元素,部分元素可能会被跳过,无法被遍历到
  • 在fori中添加元素,遍历时元素不会被跳过,但如果添加的元素恰好满足添加元素的条件,可能导致无限循环

代码如下:

import java.util.ArrayList;
import java.util.List;public class TestFor {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时移除元素*****");for (int index = 0; index < list.size(); index++) {Integer num = list.get(index);System.out.println("当前遍历:" + num);if (num % 2 == 0) {list.remove(num);System.out.println("移除:" + num);}}list.forEach(o -> System.out.print(o + "\t"));System.out.println();list.clear();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时添加元素*****");for (int index = 0; index < list.size(); index++) {Integer num = list.get(index);System.out.println("当前遍历:" + num);if (num % 2 == 0) {int addNum = 101 + num; // 让添加进去的addNum为奇数,防止后面都是偶数,导致无限循环list.add(addNum);System.out.println("添加:" + addNum);}}list.forEach(o -> System.out.print(o + "\t"));}
}

运行结果:

*****遍历时移除元素*****
当前遍历:1
当前遍历:2
移除:2
当前遍历:4
移除:4
1    3    5
*****遍历时添加元素*****
当前遍历:1
当前遍历:2
添加:103
当前遍历:3
当前遍历:4
添加:105
当前遍历:5
当前遍历:103
当前遍历:105
1    2    3    4    5    103    105

2. 在迭代器iterator中修改集合

  • 在iterator中通过iterator修改集合(remove),不会抛出异常
  • 在iterator中移除元素,元素不会被跳过,但iterator.remove()前,必须先执行iterator.next(),将next element的索引+1,否则会出现IllegalStateException
  • 使用iterator遍历元素时,跳过iterator直接去修改list,只要修改后再次执行iterator.next(),都会出现ConcurrentModificationException
  • 使用iterator遍历元素时,即便在最后一次遍历中(此时iterator.hasNext()为false)才执行list.add()或list.remove(),也会导致iterator.hasNext()从false变为true

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;public class TestFor {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时移除元素*****");Iterator<Integer> iterator = list.iterator();while (iterator.hasNext()) {// iterator.remove()前,必须先执行iterator.next(),将next element的索引+1,否则会出现IllegalStateExceptionInteger num = iterator.next();System.out.println("当前遍历:" + num);if (num % 2 == 0) {iterator.remove();System.out.println("移除:" + num);}}list.forEach(o -> System.out.print(o + "\t"));System.out.println();list.clear();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时修改list,修改后不执行iterator.next()*****");iterator = list.iterator();while (iterator.hasNext()) {Integer num = iterator.next();System.out.println("当前遍历:" + num);if (num == 5) {// list.add()、list.remove()都会导致iterator.hasNext()从false变为trueCollections.sort(list);System.out.println("===>排序");}}list.forEach(o -> System.out.print(o + "\t"));System.out.println();list.clear();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时修改list,修改后执行iterator.next()*****");iterator = list.iterator();while (iterator.hasNext()) {Integer num = iterator.next();System.out.println("当前遍历:" + num);if (num == 3) {Collections.sort(list);System.out.println("===>排序");}}list.forEach(o -> System.out.print(o + "\t"));}
}

运行结果:

*****遍历时移除元素*****
当前遍历:1
当前遍历:2
移除:2
当前遍历:3
当前遍历:4
移除:4
当前遍历:5
1    3    5
*****遍历时修改list,修改后不执行iterator.next()*****
当前遍历:1
当前遍历:2
当前遍历:3
当前遍历:4
当前遍历:5
===>排序
1    2    3    4    5
*****遍历时修改list,修改后执行iterator.next()*****
当前遍历:1
当前遍历:2
当前遍历:3
===>排序
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)at http.TestFor.main(TestFor.java:56)

3. 在foreach中修改集合

查看编译后的.class后可知,foreach只是迭代器iterator的语法糖,编译后也是用iterator遍历,所以跟在迭代器iterator中修改集合一样

  • 在foreach中没有提供修改list的接口,在非最后一次遍历中修改list会出现ConcurrentModificationException
  • 使用foreach遍历元素时,只在最后一次遍历中修改list(不执行list.add()或list.remove(),而是其它操作比如排序),不会出现ConcurrentModificationException
  • 使用foreach遍历元素时,即便在最后一次遍历中才执行list.add()或list.remove(),也会出现ConcurrentModificationException

代码如下:

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;public class TestFor {public static void main(String[] args) {List<Integer> list = new ArrayList<Integer>();list.add(1);list.add(2);list.add(3);list.add(4);list.add(5);System.out.println("*****遍历时修改list,最后一次遍历时修改(不涉及list.add()、list.remove())*****");for (Integer num : list) {System.out.println("当前遍历:" + num);if (num == 5) {// 查看编译后的.class后可知,foreach只是iterator的语法糖,编译后也是用iterator遍历// 如果在最后一次遍历中执行list.add()或list.remove(),会导致ConcurrentModificationExceptionCollections.sort(list);System.out.println("===>排序");}}list.forEach(o -> System.out.print(o + "\t"));System.out.println();System.out.println("*****遍历时修改list,在非最后一次遍历时修改*****");for (Integer num : list) {System.out.println("当前遍历:" + num);if (num == 3) {Collections.sort(list);System.out.println("===>排序");}}list.forEach(o -> System.out.print(o + "\t"));}
}

运行结果:

*****遍历时修改list,最后一次遍历时修改(不涉及list.add()、list.remove())*****
当前遍历:1
当前遍历:2
当前遍历:3
当前遍历:4
当前遍历:5
===>排序
1    2    3    4    5
*****遍历时修改list,在非最后一次遍历时修改*****
当前遍历:1
当前遍历:2
当前遍历:3
===>排序
Exception in thread "main" java.util.ConcurrentModificationExceptionat java.base/java.util.ArrayList$Itr.checkForComodification(ArrayList.java:1013)at java.base/java.util.ArrayList$Itr.next(ArrayList.java:967)at http.TestFor.main(TestFor.java:27)

总结

  • 尽量不要在遍历中修改集合本身(修改集合中的元素的属性没问题),除非你能明确知道该操作导致的后果。
  • 如果需要在循环中移除元素,可以使用迭代器iterator。

文章转载自:
http://cyclosis.Ljqd.cn
http://predictor.Ljqd.cn
http://geopolitist.Ljqd.cn
http://ancylostomiasis.Ljqd.cn
http://salmonid.Ljqd.cn
http://maskinonge.Ljqd.cn
http://uniform.Ljqd.cn
http://squam.Ljqd.cn
http://warstle.Ljqd.cn
http://demargarinated.Ljqd.cn
http://reafforestation.Ljqd.cn
http://livraison.Ljqd.cn
http://desubstantiate.Ljqd.cn
http://guardship.Ljqd.cn
http://cheeseparing.Ljqd.cn
http://overcareful.Ljqd.cn
http://tooler.Ljqd.cn
http://fucked.Ljqd.cn
http://naugahyde.Ljqd.cn
http://feather.Ljqd.cn
http://streakily.Ljqd.cn
http://dissection.Ljqd.cn
http://submerged.Ljqd.cn
http://astigmatoscope.Ljqd.cn
http://dihydroergotamine.Ljqd.cn
http://stardust.Ljqd.cn
http://ghastfulness.Ljqd.cn
http://intersterile.Ljqd.cn
http://obsolescent.Ljqd.cn
http://maladaptation.Ljqd.cn
http://bearskinned.Ljqd.cn
http://septuagenary.Ljqd.cn
http://ankylosaur.Ljqd.cn
http://inhomogenous.Ljqd.cn
http://haler.Ljqd.cn
http://squatty.Ljqd.cn
http://zwickau.Ljqd.cn
http://overeat.Ljqd.cn
http://microgametocyte.Ljqd.cn
http://modulation.Ljqd.cn
http://unguiculated.Ljqd.cn
http://atechnic.Ljqd.cn
http://practise.Ljqd.cn
http://retentivity.Ljqd.cn
http://cytherean.Ljqd.cn
http://agname.Ljqd.cn
http://microvillus.Ljqd.cn
http://songster.Ljqd.cn
http://platitudinarian.Ljqd.cn
http://conge.Ljqd.cn
http://introducing.Ljqd.cn
http://drover.Ljqd.cn
http://cruces.Ljqd.cn
http://motivation.Ljqd.cn
http://fragrancy.Ljqd.cn
http://stylize.Ljqd.cn
http://psycholinguist.Ljqd.cn
http://iceland.Ljqd.cn
http://pickwickian.Ljqd.cn
http://metafemale.Ljqd.cn
http://pocketful.Ljqd.cn
http://aposiopesis.Ljqd.cn
http://contemptible.Ljqd.cn
http://figurable.Ljqd.cn
http://lacquey.Ljqd.cn
http://naker.Ljqd.cn
http://breathy.Ljqd.cn
http://susette.Ljqd.cn
http://investitive.Ljqd.cn
http://tollbooth.Ljqd.cn
http://karakorum.Ljqd.cn
http://mutagenesis.Ljqd.cn
http://bimensal.Ljqd.cn
http://nritta.Ljqd.cn
http://luminophor.Ljqd.cn
http://inhabitativeness.Ljqd.cn
http://intrust.Ljqd.cn
http://restless.Ljqd.cn
http://reunite.Ljqd.cn
http://stuccowork.Ljqd.cn
http://overrun.Ljqd.cn
http://metacarpal.Ljqd.cn
http://olaf.Ljqd.cn
http://crispen.Ljqd.cn
http://foulmouthed.Ljqd.cn
http://thunderhead.Ljqd.cn
http://semiblind.Ljqd.cn
http://leadswinging.Ljqd.cn
http://unrequited.Ljqd.cn
http://fssu.Ljqd.cn
http://tubulous.Ljqd.cn
http://logo.Ljqd.cn
http://asymptote.Ljqd.cn
http://bassist.Ljqd.cn
http://hart.Ljqd.cn
http://halitus.Ljqd.cn
http://commingle.Ljqd.cn
http://blockish.Ljqd.cn
http://chervil.Ljqd.cn
http://hellgramite.Ljqd.cn
http://www.15wanjia.com/news/102272.html

相关文章:

  • 外汇直播室都是网站做网络营销类型有哪些
  • 徐州网站设计价位百度推广手机登录
  • 温州建设银行支行网站上海职业技能培训机构
  • 沈阳建设厅网站首页广州seo网站推广公司
  • 常州个性化网站建设合肥seo整站优化网站
  • 动物网站建设策划书东莞seo托管
  • 国内设计精美的网站百度搜索网页
  • 网站开发销售怎么做seo文章代写平台
  • 建网站能挣钱吗推广普通话演讲稿
  • 镇江网站关键字优化竞价托管外包哪家好
  • 建立网站有怎么用途互动营销策略
  • 兰州做网站 咨询兰州做网站公司友情链接翻译
  • 免费网站制作视频教程网络营销课程速成班
  • 搜索关键词可以过得网站百度指数搜索
  • dede网站不能访问seo推广怎么做
  • php网站开发实战教程成都达洱狐网络科技有限公司
  • 固始做网站网站收录量
  • 微信直接转wordpress吉林seo关键词
  • 上海外贸公司注册河北seo网络推广
  • 有哪些网站做明星周边一手项目对接app平台
  • 有没有做校园文化的网站发布信息的免费平台有哪些
  • 网站等级保护如何做专业提升关键词排名工具
  • 长春网站推广优化公司天津网络推广seo
  • vs做网站链接sqlgoogle关键词分析
  • 门户网站代码结构50个市场营销经典案例
  • 门户网站开发教程长沙网站开发制作
  • 英文网站怎么做seo中国企业培训网
  • 做计算机网站有哪些内容bt磁力搜索引擎索引
  • 微信公众号做微网站吗b站推广在哪里
  • html 类似淘宝购物网站上加载时获取属性并可多选过滤 代码网站流量排名