List循环删除元素方法

本文探讨了在Java中从List集合批量删除元素的不同方法,并详细分析了使用ArrayList的remove方法、Iterator接口以及创建临时集合来实现批量删除的具体实现及效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       最近在写项目要对一个List集合元素不需要的某些元素删除,遇到循环批量删除结果和预期的不对,之后查看了jdk源码才解决问题,所以没事看看源码还是好处多多,记录一下,以后碰到可以翻出来看看。

package com.okhqb.mode.singleton;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

/**
 * 测试List批量删除集合元素
 * 
 * 说明:  1、removeByListIndex(list1)和removeByListElements(list2)方法; 
 * 		直接调用ArryList的remove()方法不能循环批量删除List的集合元素,源码如下:
	    public E remove(int index) {
			RangeCheck(index);
			modCount++;
			E oldValue = (E) elementData[index];
			int numMoved = size - index - 1;
			if (numMoved > 0)
			    System.arraycopy(elementData, index+1, elementData, index,
					     numMoved);
			elementData[--size] = null; // Let gc do its work
			return oldValue;
	    }
	    
	 2、removeByIterator(list3)通过list的Iterator接口循环可以直接remove()掉元素
	          可以完成批量循环删除ArrayList集合元素任务
	          
	 3、removeByTempList(list4)通过创建临时集合记录需要删除元素信息,其实也是调用Iterator接口循环可以直接remove()
	          可以完成批量循环删除ArrayList集合元素任务,源码如下AbstractCollection:
		 public boolean removeAll(Collection<?> c) {
			boolean modified = false;
			Iterator<?> e = iterator();
			while (e.hasNext()) {
			    if (c.contains(e.next())) {
				e.remove();
				modified = true;
			    }
			}
			return modified;
	    }
 * 
 * @author Zhenbin.Li
 *
 */
public class RemoveListElements {
	
	/** 测试List集合长度  */
	private static final int TEST_REMOVE_SIZE = 20;
	
	/** 单例  */
	private static RemoveListElements instance = null;
	private RemoveListElements() {};
	public static synchronized RemoveListElements getInstance() {
		if (instance == null) {
			instance = new RemoveListElements();
		}
		return instance;
	}
	
	/**
	 * 三种不同的方式执行删除List元素,比较输出结果
	 */
	public void doRemove() {
		
		List<String> list1 = new ArrayList<String>(TEST_REMOVE_SIZE);
		List<String> list2 = new ArrayList<String>(TEST_REMOVE_SIZE);
		List<String> list3 = new ArrayList<String>(TEST_REMOVE_SIZE);
		List<String> list4 = new ArrayList<String>(TEST_REMOVE_SIZE);
		for (int i = 0; i < TEST_REMOVE_SIZE; i++) {
			list1.add(String.valueOf(i));
			list2.add(String.valueOf(i));
			list3.add(String.valueOf(i));
			list4.add(String.valueOf(i));
		}
		
		try {
			
			removeByListIndex(list1);
			removeByListElements(list2);
			removeByIterator(list3);
			removeByTempList(list4);
		} catch (RuntimeException ex) {
			System.out.println("error message=" + ex.getMessage());
			throw ex;
		} catch (Exception ex) {
			
			ex.printStackTrace();
		}
	}
	
	/**
	 * 通过List集合索引删除List集合元素信息
	 * 
	 * @param list list集合
	 */
	protected void removeByListIndex(List<String> list) {
		
		doValidParams(list);
		for (int index = 0; index < list.size(); index++) {
			if (index % 2 == 0) {
				list.remove(index);
			}	
		}
		System.out.println("removeByListIndex, List Elements=" + list);	
	}
	
	/**
	 * 通过List元素值删除List集合元素信息
	 * 
	 * @param list list集合
	 */
	protected void removeByListElements(List<String> list) {
		
		doValidParams(list);
		for (int index = 0; index < list.size(); index++) {
			if (index % 2 == 0) {
				list.remove(String.valueOf(index));
			}	
		}
		System.out.println("removeByListElements, List Elements=" + list);
	}
	
	/**
	 * 通过Iterator值删除List集合元素信息
	 * 
	 * @param list list集合
	 */
	protected void removeByIterator(List<String> list) {
		
		doValidParams(list);
		for (Iterator<String> iterator = list.iterator(); iterator.hasNext();) {
			String listValue = iterator.next();
			if (Integer.valueOf(listValue) % 2 == 0) {
				iterator.remove();
			}
		}
		System.out.println("removeByIterator, List Elements=" + list);
	}
	
	/**
	 * 通过临时List集合值删除List集合元素信息
	 * 
	 * @param list list集合
	 */
	protected void removeByTempList(List<String> list) {
		
		doValidParams(list);
		List<String> deleteElements = new ArrayList<String>(); 
		for (int index = 0; index < list.size(); index++) {
			if (index % 2 == 0) {
				deleteElements.add(list.get(index));
			}	
		}
		list.removeAll(deleteElements);
		System.out.println("removeByTempList, List Elements=" + list);
	}
	
	/**
	 * 校验删除List参数
	 * 
	 * <p>参数校验失败抛出异常,不做打印信息</p>
	 * @param list 校验list集合
	 */
	private void doValidParams(List<String> list) {
		
		if (null == list || list.size() <= 0) {
			throw new RuntimeException("Remove List Null.");
		}
	}

	public static void main(String[] args) {
		RemoveListElements.getInstance().doRemove();
	}
}

 运行结果:

removeByListIndex, List Elements=[1, 2, 4, 5, 7, 8, 10, 11, 13, 14, 16, 17, 19]
removeByListElements, List Elements=[1, 3, 5, 7, 9, 11, 13, 14, 15, 16, 17, 18, 19]
removeByIterator, List Elements=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
removeByTempList, List Elements=[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

 

<think>嗯,用户想根据元素属性在JavaList集合中批量删除数据。首先,我需要回忆一下常见的删除方法,避免常见的坑,比如循环删除时的索引问题。 用户提到的引用中有提到使用for循环时调整索引的方法,比如每次删除后i--,这样可以避免漏掉元素。另外,引用里的错误示例也展示了提前用变量保存size会导致问题,因为删除后size变化了,但变量没更新。 所以,正确的做法可能包括传统的for循环,但需要正确处理索引。或者使用迭代器,尤其是Java的Iterator,在遍历时安全地删除元素。还有Java 8的Stream API,通过过滤来实现,这可能更简洁。 需要注意的是,不同的List实现可能有不同的删除效率,比如ArrayList和LinkedList删除时的性能差异。另外,用户可能需要根据元素的某个属性来筛选删除,比如对象的某个字段符合条件,这时候可以用Predicate或者lambda表达式。 还要考虑是否需要在原List上修改,还是创建一个新的List。使用Stream的话通常是新建,而迭代器和for循环则是原地修改。用户的问题提到“批量移除”,可能更倾向于原地修改,但两种方法都应该提到。 总结下来,回答应该包括几种方法:传统for循环正确处理索引,使用迭代器,使用removeIf方法Java 8+),以及Stream过滤。同时要指出注意事项,比如并发修改异常和性能问题。 可能还需要比较这些方法的优缺点,比如removeIf最简洁,迭代器安全,for循环可控但容易出错,Stream适合生成新集合。另外,要提醒用户在使用循环时避免引用[2]中的错误,即不要提前固定size,而应该每次都检查list.size()。 最后,确保代码示例正确,比如在for循环中正确调整i,或者在迭代器中正确调用remove()方法。对于属性过滤,举例说明如何使用条件判断,比如对象的某个字段是否符合要求。</think>根据元素属性批量删除$List$集合数据的方法Java中可以通过以下方式实现: ### 一、传统for循环方法 ```java for (int i = 0; i < list.size(); i++) { if (需要删除的条件判断) { list.remove(i); i--; // 必须调整索引 } } ``` *关键点*:每次删除元素后索引$i$需要回退,避免跳跃式删除导致遗漏[^1] ### 二、迭代器模式(推荐) ```java Iterator<Element> iterator = list.iterator(); while (iterator.hasNext()) { Element e = iterator.next(); if (e.getProperty().equals(targetValue)) { // 根据属性判断 iterator.remove(); // 安全删除 } } ``` *优势*:避免`ConcurrentModificationException`异常,无需手动维护索引[^2] ### 三、Java 8+ removeIf方法 ```java list.removeIf(e -> e.getProperty() > threshold); // 使用lambda表达式 ``` *特点*:单行代码实现批量删除,底层使用迭代器实现[^3] ### 四、Stream过滤(创建新集合) ```java List<Element> filteredList = list.stream() .filter(e -> !e.shouldDelete()) // 设置过滤条件 .collect(Collectors.toList()); ``` *适用场景*:需要保留原集合时使用,生成新集合 ### 注意事项 1. **循环删除陷阱**:直接使用固定长度循环会导致漏删(如引用[2]的错误示例) 2. **对象属性比较**:需正确重写`equals()`和`hashCode()`方法 3. **线程安全**:多线程环境需加同步锁或使用`CopyOnWriteArrayList` 4. **性能优化**:对`ArrayList`建议倒序遍历删除,`LinkedList`正序遍历更高效 示例:删除年龄大于30的用户 ```java users.removeIf(user -> user.getAge() > 30); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值