循环中安全删除集合元素

在循环中删除集合元素可能出现数组越界的问题,比如:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
for (Integer item : list) {
    System.out.println(item);
    if (item == 1) {
        list.remove(item);
    }
}

正确的做法是使用迭代器:

List<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
Iterator<Integer> iterator = list.iterator();
while (iterator.hasNext()) {
    Integer i = iterator.next();
    System.out.println(i);
    if (i == 1)
        iterator.remove();
}

for (Integer i : list) {
    System.out.println(i);
}


如果是 ArrayList,也可以倒序遍历时删除。

原文地址:https://www.cnblogs.com/xmsx/p/9747050.html

时间: 2024-10-09 09:03:54

循环中安全删除集合元素的相关文章

java循环中如何删除集合中的元素

public void remove(){   List<String> list = new ArrayList<String>();   list.add("a");   list.add("b");   list.add("a");   list.add("c");   list.add("d");   Iterator<String> it = list.iter

java之增强for循环以及几种删除集合元素的方式

1 public class Demo1_Foreach { 2 3 /* 4 * 增强for循环格式: 5 * for(元素数据类型 变量 : 数组或者Collection集合){ 6 * 使用变量即可,该变量就是元素 7 * } 8 * 实质:底层依赖的是迭代器 9 */ 10 public static void main(String[] args) { 11 12 //demo1(); 13 List<String> l = new ArrayList<>(); 14 l

js forEach参数详解,forEach与for循环区别,forEach中如何删除数组元素

 壹 ? 引 在JS开发工作中,遍历数组的操作可谓十分常见了,那么像for循环,forEach此类方法自然也不会陌生,我个人也觉得forEach不值得写一篇博客记录,直到我遇到了一个有趣的问题,我们来看一段代码: let arr = [1, 2]; arr.forEach((item, index) => { arr.splice(index, 1); console.log(1); //输出几次? }); console.log(arr) //? 请问,这段代码执行完毕后arr输出为多少?循环

matlab中怎样删除重复元素使得和Python中集合set的功能一样

1 >> m=[1,1,2,2,3]; 2 >> m 3 4 m = 5 6 1 1 2 2 3 7 8 >> b=unique(m) 9 10 b = 11 12 1 2 3 使用unique函数;从而去掉重复元素,统计出现的元素及元素个数; 例如: 1 >> a=[1,2,3,2;5,2,9,7;8,0,6,3]; 2 >> a 3 4 a = 5 6 1 2 3 2 7 5 2 9 7 8 8 0 6 3 9 10 >> b=u

如何在循环中访问list前后元素

1. 复制整个list Copying and incrementing/decrementing the copy is the only way it can be done. You can write wrapper functions to hide it (and as mentioned in answers, C++11 has std::prev/std::next which do just that (and Boost defines similar functions)

javascript在数组的循环中删除元素

在开发JavaScript应用的过程中,经常会遇到在循环中移除指定元素的需求. 按照常规的思路,就是对数组进行一个for循环,然后在循环里面进行if判断,在判断中删除掉指定元素即可. 但是实际情况往往不会像预想的那样顺利运行. 出现的问题场景还原 (function () { var arr = [1, 2, 2, 3, 4, 5]; for (var i = 0; i < arr.length; i++){ // 打印数组中的情况,便于跟踪数组中数据的变化 console.log(i + '

JS中彻底删除json对象组成的数组中的元素

只是分享一个小知识~ 在JS中,对于某个由json对象组成的数组,例如: var test = [{ "a": "1", "b": "2" }, { "a": "3", "b": "4" }, { "a": "5", "b": "6" }]; 如果我们想要删除其中的第二

JAVA并发七(多线程环境中安全使用集合API)

在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁.因此,对于更改集合内容的方法,没有一个是同步化的.集合本质上是非多线程安全的,当多个线程与集合交互时,为了使它多线程安全,必须采取额外的措施. 在Collections类 中有多个静态方法,它们可以获取通过同步方法封装非同步集合

【Java并发编程】之八:多线程环境中安全使用集合API(含代码)

 在集合API中,最初设计的Vector和Hashtable是多线程安全的.例如:对于Vector来说,用来添加和删除元素的方法是同步的.如果只有一个线程与Vector的实例交互,那么,要求获取和释放对象锁便是一种浪费,另外在不必要的时候如果滥用同步化,也有可能会带来死锁.因此,对于更改集合内容的方法,没有一个是同步化的.集合本质上是非多线程安全的,当多个线程与集合交互时,为了使它多线程安全,必须采取额外的措施. 在Collections类 中有多个静态方法,它们可以获取通过同步方法封装非同步集