`

ArrayList根据条件+for循环批量删除的方法

阅读更多
场景如下:
ArrayList<Obj> list

Obj-> createTime, sid.

现在要根据obj的createTime来进行定期清理。(释放内存)

-------------------------

首先想到的方法就是
for(Obj o:list){
  if(o.createTime-currentT>xxx){
     list.remove(o);
}
}



这个是完全行不通的。这里看一下ArrayList的代码
    public boolean remove(Object o) {
        if (o == null) {
            for (int index = 0; index < size; index++)
                if (elementData[index] == null) {
                    fastRemove(index);
                    return true;
                }
        } else {
            for (int index = 0; index < size; index++)
                if (o.equals(elementData[index])) {
                    fastRemove(index);
                    return true;
                }
        }
        return false;
    }

这里会对elementDate进行循环,当满足条件时,就会执行fastRemove()方法。


fastRemove
 private void fastRemove(int index) {
        modCount++;
        int numMoved = size - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
    }

  System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--size] = null; // Let gc do its work
这里实际上是让数组先位移,后删除最后一个。
关于arraycopy可以参考下面
		int arr1[] ={0,1,2,3,4,5};
		System.arraycopy(arr1, 4, arr1, 3, 2);
		
		
		System.out.println("array1= ");
		System.out.println(arr1[0]+" ");
		System.out.println(arr1[1]+" ");
		System.out.println(arr1[2]+" ");
		System.out.println(arr1[3]+" ");
		System.out.println(arr1[4]+" ");
		System.out.println(arr1[5]+" ");
//0 1 2  4 5 5  这里把3删除了,把4和5向左移动了。
elementData[--size]=null在这里就相当于把最后一个5删除了。



这里就能明白为什么for循环+remove不能进行批量删除了。
每次执行完fastRemove, 集合里面的数组的size直接就减小1了。同时后面的数组内的对象全部被左移。
也就是说:
[0,1,2,3]
执行for循环第一轮变为-> [1,2,3]
第二轮的时候,指针已经指向了2, 此时 1就被留了下来,并且没有被做任何处理。。





==========================分割线===============================

解决方法是使用iterator

		List<String> list=new ArrayList<String>();
		list.add("hello");
		list.add("world1");
		list.add("world2");list.add("world3");
		list.add("world4");
		
		
		for(Iterator<String>it=list.iterator();it.hasNext();){
			String s=(it.next());
			System.out.println(s);
			it.remove();
		}

		
		System.out.println(list);


iterator相当于是执行remove之后,指针自动被移动到刚才被删除的地方。 因此再次执行next的时候,就会按照顺序执行下去了。 具体参考iterator源码。
分享到:
评论

相关推荐

    ssh中用到的批量删除

    - 与DAO层类似,Service层也定义了一个批量删除的方法,参数同样为一个对象列表。 - **实现类**: ```java private DK_Info_BDao DK_Info_BDao; // 需要设置get和set方法 public void deleteAll(List list) { ...

    遍历并批量删除容器中元素出现ConcurrentModificationException原因及处置

    标题中提到的“遍历并批量删除容器中元素”是引发此异常的一个典型操作。在Java中,我们通常会使用`Iterator`来安全地遍历并修改集合,因为`Iterator`提供了`remove()`方法来删除当前迭代的元素。但如果你在不使用`...

    mybatispuls3.5使用批量插入

    MyBatisPlus是MyBatis框架的一个扩展,它提供了更多的便捷功能,包括简化SQL操作、自动填充 CRUD(创建、读取、更新、删除)操作等。在MyBatisPlus 3.5版本中,批量插入功能是其核心优化之一,这对于大数据量的操作...

    数据库批量执行,加快运行速度

    这段代码中,通过循环遍历`ArrayList`列表中的`GoodsBean`对象,构建对应的插入SQL语句,并使用`addBatch()`方法添加到批处理队列中。最后调用`executeBatch()`方法,一次性执行所有插入操作。 ### 总结 数据库...

    java 对ArrayList进行分页实例代码

    在Java编程中,ArrayList是集合框架的一个重要组成部分,它提供了动态数组的功能,允许开发者方便地添加、删除和访问元素。然而,在处理大量数据时,一次性加载所有数据可能会导致内存压力,这时就需要进行分页处理...

    SpringBoot JdbcTemplate批量操作的示例代码

    例如,使用JPA的`EntityManager.persist()`方法进行批量保存时,实际上是在循环中逐个保存对象,这在性能上并不理想。 为了提升性能,我们可以利用Spring的JdbcTemplate。JdbcTemplate提供了多种方法来支持批量操作...

    Hbase笔记 —— 利用JavaAPI的方式操作Hbase数据库(往hbase的表中批量插入数据).pdf

    在本文档中,我们将深入探讨如何使用Java API与HBase数据库进行交互,特别是关于如何创建表、修改表结构以及批量插入数据。HBase是Apache的一个分布式、可扩展的大数据存储系统,它基于谷歌的Bigtable设计,适用于...

    两种实现JDBC添加、删除、修改操作的方法对比

    两种实现JDBC添加、删除、修改操作的方法对比 在本文中,我们将讨论两种实现JDBC添加、删除、修改操作的方法对比。这些方法可以用来实现添加、删除、修改操作的共用方法,分为两个方法:一个是设置...

    java一次性查询处理几百万数据解决方法

    ### Java一次性查询处理几百万数据解决方法 在Java开发中,处理大数据量是常见的需求之一,特别是当数据规模达到几百万级别时,如何高效、稳定地处理这些数据变得尤为重要。本文将详细介绍一种Java一次性查询处理几...

    使用递归删除树形结构的所有子节点(java和mysql实现)

    下面将为大家介绍使用 Java 和 MySQL 实现递归删除树形结构的所有子节点的方法。 一、业务场景 在树形结构中,删除某个父节点时,需要删除其所有子节点,以避免遗留冗余数据。例如,以下树形结构: +—0 +—1 +—...

    C#应用实践教程

    - **for循环**:一种常用的循环结构,用于重复执行一段代码多次。 - **程序调试技术**:找出并修复程序中的错误的过程。 - **while循环与do-while循环** - **while循环**:当条件为真时重复执行一段代码。 - **...

    本地员工管理系统

    5. **条件语句与循环**:在处理员工信息时,可能需要使用if...else语句进行条件判断,或者使用for/while循环遍历数据。 6. **文件操作**:可能涉及读写文件,如保存和加载员工数据到文本文件或数据库,这就需要用到...

    Java极品学习资料

    - `for`循环适用于已知循环次数的情况。 - `while`循环适合于未知循环次数的情况。 - 示例代码展示两种循环的不同应用场景。 **垃圾回收机制** - Java通过自动垃圾回收管理内存,回收不再使用的对象所占的空间。 - ...

    计算机专业

    -增强的for循环(foreach):`for (int element : myArray) { System.out.println(element); }` 6. **Java中的数组操作示例**: - `ArrayDemo.java`可能演示了基本的数组创建、初始化、访问和遍历操作。 - `...

    08-《集合框架-1》.rar

    - 遍历集合,可以使用迭代器(Iterator)或增强for循环(foreach)。 4. **泛型**: - 泛型在集合框架中的应用,用于限制集合中存储的数据类型,提高代码安全性和可读性。 5. **Collection和Iterable接口**: -...

    Android Canvas使用集合

    例如,我们可以创建一个ArrayList来存储多个矩形的坐标,然后在一个循环中调用canvas.drawRect()来绘制这些矩形。这样可以方便地管理多个图形,同时进行添加、删除或修改操作。 ```java List&lt;Rect&gt; rects = new ...

    java - 实用技巧

    此外,`Vector` 还提供了 `removeAllElements()` 方法来清空整个列表,这对于批量删除元素非常有用。 示例代码: ```java v.removeAllElements(); ``` **2.3 性能优化** 为了提高性能,建议在初始化 `Vector` 时...

    java实现把一个List集合拆分成多个的操作

    在Java编程中,有时我们需要对批量数据进行分批处理,特别是在大数据或性能优化的场景下。List集合是Java集合框架中常用的一种数据结构,用于存储有序的元素序列。本篇文章将详细讲解如何使用Java实现将一个List集合...

    Android 带CheckBox的ListView 实现多选,全选,反选,删除效果

    - 循环添加数据:`for (int i = 0; i ; i++) { String str = "Item" + i; list.add(str); }` 3. **设置多选状态**: - 使用布尔变量`isMultiSelect`来控制多选模式的开启与关闭。 4. **创建适配器**: - 自定义...

    java集合与泛型.pdf

    Java 5之后,引入了增强型for循环,使得遍历集合更加简洁方便。 具体到实现层面,例如HashSet,它实现了Set接口,使用哈希表来存储集合元素,其内部通过HashMap实现。当我们创建HashSet实例时,可以指定初始容量和...

Global site tag (gtag.js) - Google Analytics