我知道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();
}
}
}
}