JAVA中循环遍历list有三种方式for循环、增强for循环(也就是常说的foreach循环)、iterator遍历。

1、for循环遍历list

for(int i=0;i

if(list.get(i).equals("del"))

list.remove(i);

}

这种方式的问题在于,删除某个元素后,list的大小发生了变化,而你的索引也在变化,所以会导致你在遍历的时候漏掉某些元素。比如当你删除第1个元素后,继续根据索引访问第2个元素时,因为删除的关系后面的元素都往前移动了一位,所以实际访问的是第3个元素。因此,这种方式可以用在删除特定的一个元素时使用,但不适合循环删除多个元素时使用。

2、增强for循环

for(String x:list){

if(x.equals("del"))

list.remove(x);

}

这种方式的问题在于,删除元素后继续循环会报错误信息ConcurrentModificationException,因为元素在使用的时候发生了并发的修改,导致异常抛出。但是删除完毕马上使用break跳出,则不会触发报错。

3、iterator遍历(推荐)

Iterator it = list.iterator();

while(it.hasNext()){

String x = it.next();

if(x.equals("del")){

it.remove();

}

}

这种方式可以正常的循环及删除。但要注意的是,使用iterator的remove方法,如果用list的remove方法同样会报上面提到的ConcurrentModificationException错误。

总结:

(1)循环删除list中特定一个元素的,可以使用三种方式中的任意一种,但在使用中要注意上面分析的各个问题。

(2)循环删除list中多个元素的,应该使用迭代器iterator方式。

---20200427↓---

4.使用Java 8中提供的filter过滤

Java 8中可以把集合转换成流,对于流有一种filter操作, 可以对原始 Stream 进行某项测试,通过测试的元素被留下来生成一个新 Stream。

List userNames = new ArrayList() {{

add("Hollis");

add("hollis");

add("HollisChuang");

add("H");

}};

userNames= userNames.stream().filter(userName -> !userName.equals("Hollis")).collect(Collectors.toList());

System.out.println(userNames);//[hollis, HollisChuang, H]

5.使用增强for循环其实也可以

如果,我们非常确定在一个集合中,某个即将删除的元素只包含一个的话, 比如对Set进行操作,那么其实也是可以使用增强for循环的,只要在删除之后,立刻结束循环体,不要再继续进行遍历就可以了,也就是说不让代码执行到下一次的next方法。

List userNames = new ArrayList() {{

add("Hollis");

add("hollis");

add("HollisChuang");

add("H");

}};for(String userName : userNames) {if (userName.equals("Hollis")) {

userNames.remove(userName);break;

}

}

System.out.println(userNames);//[hollis, HollisChuang, H]

6.使用fail-safe的集合类

在Java中,除了一些普通的集合类以外,还有一些采用了fail-safe机制的集合类。这样的集合容器在遍历时不是直接在集合内容上访问的,而是先复制原有集合内容,在拷贝的集合上进行遍历。

由于迭代时是对原集合的拷贝进行遍历,所以在遍历过程中对原集合所作的修改并不能被迭代器检测到,所以不会触发ConcurrentModificationException。

ConcurrentLinkedDeque userNames = new ConcurrentLinkedDeque() {{

add("Hollis");

add("hollis");

add("HollisChuang");

add("H");

}};for(String userName : userNames) {if (userName.equals("Hollis")) {

userNames.remove();

}

}

System.out.println(userNames);//[hollis, HollisChuang, H]

基于拷贝内容的优点是避免了ConcurrentModificationException,但同样地,迭代器并不能访问到修改后的内容,即:迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的。

java.util.concurrent包下的容器都是安全失败,可以在多线程下并发使用,并发修改。

java 遍历删除list_JAVA中循环删除list中元素相关推荐

  1. JAVA中循环删除list中元素的方法总结

    原文:http://www.cnblogs.com/aspirant/p/7900854.html 印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天 ...

  2. java 删除list元素_JAVA中循环删除list中元素的方法总结

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  3. java list 范围删除_JAVA中循环删除list中元素(移除list两时间范围外的元素)

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后今天在使用时发现报错了,然后去科普了一下,再然后发现这是一个误区.下面就来讲一讲..伸手党可直接跳至文末 ...

  4. Java中循环删除list中元素的方法总结(总结)

    印象中循环删除list中的元素使用for循环的方式是有问题的,但是可以使用增强的for循环,然后在今天使用的时候发现报错了,然后去科普了一下,发现这是一个误区.下面我们来一起看一下. Java中循环遍 ...

  5. 算法 n个数字形成的圆圈中循环删除第m个数字 C++

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! //** ...

  6. 算法 - n个数字形成的圆圈中循环删除第m个数字(C++)

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net /** n个数字形成的圆圈中循环删除第m个数字 - ...

  7. scala中循环守卫_Scala中的循环

    scala中循环守卫 Scala中的循环 (Loops in Scala) In programming, many times a condition comes when we need to e ...

  8. JAVA中循环删除集合中元素的方法总结

    一.list集合循环删除元素 1.通过普通的for删除删除符合条件的多个元素 for(int i=0;i<list.size();i++){if(list.get(i).equals(" ...

  9. java for循环删除元素_JAVA中循环删除list中元素的方法总结

    JAVA中循环遍历list有三种方式for循环.增强for循环(也就是常说的foreach循环).iterator遍历. 1.for循环遍历list for(int i=0;i if(list.get ...

最新文章

  1. ​西湖大学EMBLab诚聘环境工程学、生物信息学、分子生态学科研助理
  2. python的中文翻译-再聊聊Python中文社区的翻译
  3. PayPal宣布退出虚拟货币组织Libra协会
  4. 系统架构设计师视频教程免费下载
  5. Mvc NuGet 数据迁移
  6. 他演绎了真正的“寒门逆袭”:从贫苦农村到顶级科学家,如今站在世界之巅,为祖国争光!...
  7. Sinclair 的ZX Spectrum 年逾三十
  8. Linux C++ glog日志库的简单使用
  9. 项目中libevent几个问题
  10. 物联网工程导论第二版答案选择题
  11. 微信小程序轮播图,图片自适应,图片循环播放,图片之间有空白空间
  12. CUDA By Examples 0 - 准备工作
  13. 如何通过软件实现自动阶梯计电梯费
  14. Android Emulator has terminated
  15. spring boot中使用websocket实现点对点通信与服务器推送
  16. 马上金三银四了,注意下面这几点,面试通过率高达85%
  17. 学习平面设计有哪些前途
  18. qt在表格中如何画线_Qt如何在表格中显示和编辑数据
  19. Uncaught TypeError: date.getDay is not a function at getDate
  20. 基于Log-Structured的FASS 2.0架构设计

热门文章

  1. vue获取本机ip地址
  2. 杨梅派 (Waxberry Pi)手册
  3. shell stty命令
  4. opencv给图片添加文字水印转
  5. crc16的c语言函数 计算ccitt_CCITT标准CRC-16计算C源代码
  6. wps js宏编辑器案例3-工作簿和工作表操作
  7. 一文学会MoveIt Setup Assistant搭建moveit2机械臂模型
  8. 二叉树中序非递归遍历
  9. avcodec_send_frame和avcodec_receive_packet
  10. 通过url下载文件保存到指定的不存在目录下