遍历ArrayList的过程中移除元素的方式

遍历ArrayList的过程中移除元素的方式错误方法一使用for循环正序遍历ArrayList,使用remove移除元素结果如下,只删除了一个“3”原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。publicstaticvoidmain(String[]args){ ArrayList<String>list=newArrayList<>(); list.add(“1”); list.add(“2”); list.add(“3”

大家好,又见面了,我是你们的朋友全栈君。

错误方法一

使用for循环正序遍历ArrayList,使用remove移除元素
结果如下,只删除了一个“3”

原因:在匹配到第一个要删除的元素并移除时,后面元素会往前移位,导致索引位置改变,从而漏掉后面一个元素。

public static void main(String[] args) { 
   
	 ArrayList<String> list = new ArrayList<>();
	 list.add("1");
	 list.add("2");
	 list.add("3");
	 list.add("3");
	 list.add("5");
	 list.add("6");
	 list.add("7");
	
	 for (int i = 0; i < list.size(); i++){ 
   
	     if (list.get(i).equals("3"))
	         list.remove(i);
	 }
	 
	 System.out.println(list);
}
原list:[1, 2, 3, 3, 5, 6, 7]
移除后: [1, 2, 3, 5, 6, 7]

错误方法二

使用增强for循环遍历ArrayList移除元素,
会产生java.util.ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出

for (String s : list) { 
   
    if (s.equals("3"))
        list.remove(s);
}

结果:

Exception in thread "main" java.util.ConcurrentModificationException

正确方法一

使用for循环倒序遍历ArrayList,使用remove移除元素
数组倒序遍历时即使发生元素删除也不影响后序元素遍历,因为前面的元素位置不会改变。

for (int i = list.size() - 1; i >= 0; i--){ 
   
    if (list.get(i).equals("3"))
        list.remove(i);
}

正确方法二

使用迭代器remove方法删除(推荐)

Iterator<String> iterator = list.iterator();
while (iterator.hasNext()){ 
   
    String s = iterator.next();
    if (s.equals("3"))
        iterator.remove();
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/163103.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 除了we tool还有哪些免费安全好用的微信群发软件?这两个软件比we tool好用!

    除了we tool还有哪些免费安全好用的微信群发软件?这两个软件比we tool好用!除了wetool还有哪些安全好用的微信群发软件?群发工具是社群运营使用频率最高的工具,无论是给群内推送消息,还是给个人推送消息。按键精灵:点击左侧链接下载按键精灵是一款模拟鼠标键盘动作的软件。通过制作脚本,可以让按键精灵代替您的双手,自动执行一系列鼠标键盘动作。按键精灵免费版简单易用,不需要任何编程知识就可以作出功能强大的脚本。只要您在电脑前用双手可以完成的动作,按键精灵都可以替您完成。按键精灵用途广泛,具有大量脚本资源。简单百宝箱:点击左侧链接下载简单百宝箱是一个绿色和安全的游戏

    2022年6月4日
  • hexdump用法_linux dump命令

    hexdump用法_linux dump命令本文乃fireaxe原创,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,并注明原作者及原链接。内容可任意使用,但对因使用该内容引起的后果不做任何保证。作者:fireaxe_hq@hotmail.com博客:fireaxe.blog.chinaunix.net转自:http://blog.chinaunix.net/uid-20528014-id-4087756.html开发时经常会…

    2022年9月21日
  • .NET(c#) 移动APP开发平台 – Smobiler(2) – 平台介绍

    .NET(c#) 移动APP开发平台 – Smobiler(2) – 平台介绍  看到大家很多人在后台问我一些问题,所以准备写一个系列了,下面给个目录目录:   .NET(c#)移动APP开发平台-Smobiler(1) 环境的搭建及上手第一个应用类似开发WinForm的方式,使用C#开发Android和IOS的移动应用?听起来感觉不可思议,但是实际上确实很强大,那么Smobiler平台到底是如何实现的呢,这里给大家介绍一下。客户端  Smobi…

    2022年5月29日
  • 小米bl未解锁变砖了如何刷机_如何正确刷机

    小米bl未解锁变砖了如何刷机_如何正确刷机1.一部可以解锁bl的手机选择一部合适可以解锁的手机,以小米为例(我有的),小米需要绑定账号在新手机15天。去小米官方申请(https://www.miui.com/unlock/index.html),登陆账号,下载解锁工具,在工具里面登录小米账号,数据线连接进入bl模式的手机.(解锁会清空手机数据).解锁后手机仍保修登录小米账号,下载解锁工具2.选择合适的twrp下载twrp后,电脑使用…

    2022年5月1日
  • AVAYA Distinctive Ringing带来的问题

    AVAYA Distinctive Ringing带来的问题两台AVAYA级连,上级是S8700,板卡是模拟内线板;下级是DefinityG3si,板卡是COTRUNKTN465C,配置成loop-startCOtrunk,指向VDN。问题如下:从S8700的内线呼入到G3si…

    2022年11月3日
  • idea中选中一行的快捷键_idea撤销快捷键恢复

    idea中选中一行的快捷键_idea撤销快捷键恢复之前前端开发一直使用VSCode,常用快捷键删除一行或者当前选中的几行代码,使用idea的时候发现快捷键并不相同,查看发现idea的快捷是:Ctrl+Y,比手动删除代码方便很多。通过File->Setttings->Keymap可以查看已经设置好的快捷键:…

    2022年9月7日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号