java ArrayList遍历删除效率对比

最近在程序中使用到了ArrayList的删除方法。

我知道list有两种迭代方式(Iterator,index)。我写了两个方法根据这两种迭代方式做删除操作,看哪种速度快一点

/** iterator方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIterator(List<String> list, Set<String> deleted){

Iterator<String> it = list.iterator();
String string;
while (it.hasNext()) {
string = (String) it.next();
if(deleted.contains(string)){
it.remove();
}
}
}
/**index 方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIndex(List<String> list, Set<String> deleted){

String string;
for(int i =0 ;i<list.size(); ){
string = list.get(i);
if(deleted.contains(string)){
list.remove(i);
} else {
i++;
}
}
}


经过100000000次运算我得到的数据如下:
通过index删除耗时:7555ms
通过Iterator删除耗时:10226ms
通过Index方式便利删除list速度更快一些。
有人会问list.size()每次计算会不会很耗时,其实是大可不必担心的。因为list.size()。本就是取的是ArrayList父类AbstractList的私有变量的值。ArrayList是基于迭代模式编写的类。懂其原理的应该都知道。


下面是我的测试类:


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




public class TestLIstRemove {

/**原始数据*/
private static List<String> list;
/** 想要从list中删除的数据*/
private static Set<String> deleted;
/** 开始结束事件定义*/
private static long startTime,endTime,baseTime;
/** 循环次数*/
private static int maxTimes = 100000000;

public static void main(String[] args) {

initData();
List <String> cpdList  = null;


/** 逻辑正确性测试*/
cpdList = new ArrayList<String>(list);
listRemoveByIterator(cpdList, deleted);
System.out.println("iterator方式删除输出结果:");
for(String e : cpdList){
System.out.print(e + " ");
}
System.out.println();

cpdList = new ArrayList<String>(list);
listRemoveByIndex(cpdList, deleted);
/** 逻辑正确性测试*/
System.out.println("index方式删除输出结果:");
for(String e : cpdList){
System.out.print(e + " ");
}
System.out.println();
System.out.println();

/** 运算速度测试*/

/** 创建对象耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);
}
endTime = System.currentTimeMillis();
baseTime = endTime-startTime;
System.out.println("创建对象耗时:" + (baseTime)+"ms");

/** 通过index删除耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);

listRemoveByIndex(cpdList, deleted);
}
endTime = System.currentTimeMillis();
System.out.println("通过index删除耗时:" + (endTime-startTime-baseTime)+"ms");


/** 通过Iterator删除耗时*/
startTime = System.currentTimeMillis();
for(int i=0; i<maxTimes;i++){
cpdList = new ArrayList<String>(list);

listRemoveByIterator(cpdList, deleted);
}
endTime = System.currentTimeMillis();


System.out.println("通过Iterator删除耗时:" + (endTime-startTime-baseTime)+"ms");
}

/**
* 初始化数据
*/
private static void initData(){
list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
list.add("e");
list.add("f");
list.add("g");
list.add("h");

deleted = new HashSet<String>();
deleted.add("h");
deleted.add("e");
}



/**index 方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIndex(List<String> list, Set<String> deleted){

String string;
for(int i =0 ;i<list.size(); ){
string = list.get(i);
if(deleted.contains(string)){
list.remove(i);
} else {
i++;
}
}
}

/** iterator方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIterator(List<String> list, Set<String> deleted){

Iterator<String> it = list.iterator();
String string;
while (it.hasNext()) {
string = (String) it.next();
if(deleted.contains(string)){
it.remove();
}
}
}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值