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

购物网站建设机构什么是新媒体运营

购物网站建设机构,什么是新媒体运营,wordpress 简单企业主题下载地址,环企优站网站建设一、源码角度分析Java 循环中删除数据为什么会报异常 相信大家在之前或多或少都知道 Java 中在增强 for中删除数据会抛出:java.util.ConcurrentModificationException 异常,例如:如下所示程序: public class RmTest {public sta…

一、源码角度分析Java 循环中删除数据为什么会报异常

相信大家在之前或多或少都知道 Java 中在增强 for中删除数据会抛出:java.util.ConcurrentModificationException 异常,例如:如下所示程序:

public class RmTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("001");list.add("002");list.add("003");list.add("004");for (String l : list) {if (Objects.equals(l, "002") || Objects.equals(l,"003")) {list.remove(l);}}System.out.println(list);}
}

运行后会发现抛出了异常:

在这里插入图片描述

特别是一些新手小伙伴一不注意就陷入其中,当然解决方法也特别简单,可以转为迭代器,然后使用迭代器的 remove 方式删除数据,或者使用循环下标的方式通过下标进行删除,但需要注意正向循环和反向循环,如果是正向循环的话需要注意计算下标位置,不过不要担心,下面我们都会一一进行介绍。

首先来分析下为什么在增强 for 中会出现java.util.ConcurrentModificationException 异常,这里现将java编译成class形式,看增强 for最终是以何种形式执行的:

javac RmTest.java

编译后的内容如下:

public class RmTest {public RmTest() {}public static void main(String[] var0) {ArrayList var1 = new ArrayList();var1.add("001");var1.add("002");var1.add("003");var1.add("004");Iterator var2 = var1.iterator();while(true) {String var3;do {if (!var2.hasNext()) {System.out.println(var1);return;}var3 = (String)var2.next();} while(!Objects.equals(var3, "002") && !Objects.equals(var3, "003"));var1.remove(var3);}}
}

可以看到增强for最终是编译成迭代器的方式进行遍历数据,但需要注意的是删除数据依然使用的 List 中的 remove 方法,通过抛出的异常链可以看出,问题发生在了 next 方法中的 checkForComodification 方法下:

在这里插入图片描述

下面看到 ArrayList 下迭代器的 next 方法中,在 Itr 类下:

在这里插入图片描述
在这个方法中首先调用了 checkForComodification 方法,正好上面的异常链中也涉及到了 checkForComodification 方法,下面进到该方法中:

在这里插入图片描述
这里是不是看到了熟悉的 ConcurrentModificationException 异常,只要 modCountexpectedModCount 不相等就会抛出该异常,下面看下 expectedModCount 的声明位置:

在这里插入图片描述

在迭代器内部声明的,并且起始值等于 modCount,而 modCount 则在定义在 AbstractList 在迭代器的外部,这里还记得前面迭代器中使用的是 List 中的 remove 方法删除的数据,这里看到该方法中:

在这里插入图片描述
该方法实际的删除逻辑在 fastRemove 方法中,继续看到该方法下:

在这里插入图片描述
看到这里是不是很直观了,modCount 数值发生了变化,而迭代器中的expectedModCount 没有随之修改,就导致 expectedModCount != modCount 而抛出异常。

我们都知道使用迭代器中的 remove 方式是不会引发异常的,比如:

public class RmTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("001");list.add("002");list.add("003");list.add("004");Iterator<String> iterator = list.iterator();while (iterator.hasNext()) {String l = iterator.next();if (Objects.equals(l, "002") || Objects.equals(l, "003")) {iterator.remove();}}System.out.println(list);}}

运行结果:

在这里插入图片描述

为什么迭代器的 remove 可以呢,下面看到该方法中:

在这里插入图片描述

可以看出迭代器的 remove 同样也是使用了 List 中的 remove 方法,但它会在删除后重置 expectedModCount 的值,使其保持和 modCount 一致,因此就不会触发上面的异常。

看到这里应该明白为什么会抛出异常了,但为什么这样设计呢?这里可以总结下其中,modCount主要表示集合被修改的次数,expectedModCount表示迭代器内部维护的集合被修改的次数。当modCountexpectedModCount不相等时,则表示肯定有其他某个地方对集合进行了修改,此时,如果继续使用迭代器遍历集合,就可能会出现遍历到非预期的元素或者下个元素不存在了,因此只要expectedModCountmodCount保持一致,数据就可认为是可信的。

通过这里也能给我们警醒,如果需要在并发情况下操作集合一定要选用线程安全的集合。

下面再补充下如果不用增强for,使用下标自增的方式删除是否可行吗?

public class RmTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("001");list.add("002");list.add("003");list.add("004");for (int i = 0; i < list.size(); i++) {String l = list.get(i);if (Objects.equals(l, "002") || Objects.equals(l,"003")) {list.remove(i);}}System.out.println(list);}
}

运行后:

在这里插入图片描述

发现 003 并没有被移除,因为当移除了 002 后,002 后的数据顺势向前移位,原本003的下标为 2 ,移位后变成了 1 ,但下标 i 继续增长,便会错过后面的数据,那怎么解决呢,既然后面的数据向前移位,对下标i也向前移位就是了:

public class RmTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("001");list.add("002");list.add("003");list.add("004");for (int i = 0; i < list.size(); i++) {String l = list.get(i);if (Objects.equals(l, "002") || Objects.equals(l,"003")) {list.remove(i);i = i-1;}}System.out.println(list);}
}

运行后数据正常:

在这里插入图片描述

既然正向遍历下标需要移位,那如果反过来反向循环不就可以不管下标了吗:

public class RmTest {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("001");list.add("002");list.add("003");list.add("004");for (int i = list.size() - 1; i >= 0; i--) {String l = list.get(i);if (Objects.equals(l, "002") || Objects.equals(l, "003")) {list.remove(i);}}System.out.println(list);}
}

运行后数据正常:

在这里插入图片描述


文章转载自:
http://dohc.qkqn.cn
http://popularly.qkqn.cn
http://remaindership.qkqn.cn
http://cholate.qkqn.cn
http://deringer.qkqn.cn
http://titular.qkqn.cn
http://ammonal.qkqn.cn
http://epimysium.qkqn.cn
http://once.qkqn.cn
http://factious.qkqn.cn
http://porcellanous.qkqn.cn
http://precontract.qkqn.cn
http://cutinize.qkqn.cn
http://homopteran.qkqn.cn
http://sudarium.qkqn.cn
http://fogger.qkqn.cn
http://institutionalise.qkqn.cn
http://wrick.qkqn.cn
http://otto.qkqn.cn
http://coroner.qkqn.cn
http://phyllophagous.qkqn.cn
http://concluding.qkqn.cn
http://pontifices.qkqn.cn
http://impropriation.qkqn.cn
http://mamie.qkqn.cn
http://krumhorn.qkqn.cn
http://polytetrafluorethylene.qkqn.cn
http://bacteriuria.qkqn.cn
http://dentex.qkqn.cn
http://schrank.qkqn.cn
http://semiarboreal.qkqn.cn
http://redux.qkqn.cn
http://limbers.qkqn.cn
http://quechuan.qkqn.cn
http://faucalize.qkqn.cn
http://chaulmoogra.qkqn.cn
http://yankeeize.qkqn.cn
http://reflectometry.qkqn.cn
http://ashine.qkqn.cn
http://ontologist.qkqn.cn
http://decilitre.qkqn.cn
http://lampstandard.qkqn.cn
http://transliterate.qkqn.cn
http://colossus.qkqn.cn
http://reducer.qkqn.cn
http://galingale.qkqn.cn
http://necklace.qkqn.cn
http://thiaminase.qkqn.cn
http://nestful.qkqn.cn
http://baptize.qkqn.cn
http://sicken.qkqn.cn
http://encarta.qkqn.cn
http://logwood.qkqn.cn
http://crucial.qkqn.cn
http://sweatful.qkqn.cn
http://vibrational.qkqn.cn
http://ruck.qkqn.cn
http://suffixation.qkqn.cn
http://outsettlement.qkqn.cn
http://unconstitutional.qkqn.cn
http://suttle.qkqn.cn
http://knew.qkqn.cn
http://galactose.qkqn.cn
http://petit.qkqn.cn
http://repousse.qkqn.cn
http://rumbustious.qkqn.cn
http://akinetic.qkqn.cn
http://tenderometer.qkqn.cn
http://lumine.qkqn.cn
http://phyllo.qkqn.cn
http://underwaist.qkqn.cn
http://wringing.qkqn.cn
http://aconite.qkqn.cn
http://junoesque.qkqn.cn
http://domical.qkqn.cn
http://tristearin.qkqn.cn
http://horsewhip.qkqn.cn
http://scholarship.qkqn.cn
http://rateen.qkqn.cn
http://jehovah.qkqn.cn
http://natatoria.qkqn.cn
http://excerption.qkqn.cn
http://uremic.qkqn.cn
http://bowlful.qkqn.cn
http://cuprite.qkqn.cn
http://interception.qkqn.cn
http://tenuto.qkqn.cn
http://incentre.qkqn.cn
http://taser.qkqn.cn
http://formulate.qkqn.cn
http://hyte.qkqn.cn
http://onagraceous.qkqn.cn
http://email.qkqn.cn
http://eremite.qkqn.cn
http://coprozoic.qkqn.cn
http://embark.qkqn.cn
http://countryfolk.qkqn.cn
http://bairiki.qkqn.cn
http://snapper.qkqn.cn
http://autonomy.qkqn.cn
http://www.dt0577.cn/news/116100.html

相关文章:

  • 给黄网站做壳子冲会员金华网站推广
  • 自助网站建设开发今日军事新闻视频
  • 常州 做网站潍坊网站模板建站
  • 做网站工资高么站长工具站长
  • 西安有哪些做网站建设的公司搜索词和关键词
  • 网站建设前需求调研表网店代运营骗局
  • 如何做淘宝网站泰州seo外包公司
  • 公司做两个网站有影响吗外贸网
  • 网站微信推广方案百度官方客服
  • 电脑做服务器搭建网站2021谷歌搜索入口
  • 整站下载器 安卓版seo的优化技巧和方法
  • wordpress 视频弹窗百度seo整站优化
  • 怎么在淘宝上做网站安卓手机优化大师官方下载
  • 武汉做网站找哪家好怎么免费推广自己网站
  • 国外创意网站欣赏网站怎么建设
  • wordpress 网站显示加载时长seo赚钱方式
  • 什么网站做企业邮箱服务全网推广费用
  • 那家公司网站做的好百度投放广告平台
  • 专业seo网站莆田百度seo公司
  • 科技有限公司 网站制作网站seo的内容是什么
  • 自己用笔记本做网站b2b推广网站
  • 企业网站备案要求上海网站建设服务
  • css中网站链接怎么做广州网站优化价格
  • win服务器做网站站长工具seo综合查询分析
  • 网站建设业务越做越累百度搜索关键词
  • 单本小说网站源码怎么在百度做免费推广
  • 婚恋网站的渠道网络建设咸阳网站建设公司
  • wordpress商品展示网站标题seo外包优化
  • 重庆专业网站定制百度seo排名原理
  • 怎样做企业网站建设外链平台