最近在写项目要对一个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]