最近在程序中使用到了ArrayList的删除方法。
我知道list有两种迭代方式(Iterator,index)。我写了两个方法根据这两种迭代方式做删除操作,看哪种速度快一点
/** iterator方式删除
* @param list
* @param deleted
*/
private static void listRemoveByIterator(List list, Set deleted){
Iterator 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 list, Set deleted){
String string;
for(int i =0 ;i
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 list; /** 想要从list中删除的数据*/ private static Set deleted; /** 开始结束事件定义*/ private static long startTime,endTime,baseTime; /** 循环次数*/ private static int maxTimes = 100000000; public static void main(String[] args) { initData(); List cpdList = null; /** 逻辑正确性测试*/ cpdList = new ArrayList(list); listRemoveByIterator(cpdList, deleted); System.out.println("iterator方式删除输出结果:"); for(String e : cpdList){ System.out.print(e + " "); } System.out.println(); cpdList = new ArrayList(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(list); } endTime = System.currentTimeMillis(); baseTime = endTime-startTime; System.out.println("创建对象耗时:" + (baseTime)+"ms"); /** 通过index删除耗时*/ startTime = System.currentTimeMillis(); for(int i=0; i(list); listRemoveByIndex(cpdList, deleted); } endTime = System.currentTimeMillis(); System.out.println("通过index删除耗时:" + (endTime-startTime-baseTime)+"ms"); /** 通过Iterator删除耗时*/ startTime = System.currentTimeMillis(); for(int i=0; i(list); listRemoveByIterator(cpdList, deleted); } endTime = System.currentTimeMillis(); System.out.println("通过Iterator删除耗时:" + (endTime-startTime-baseTime)+"ms"); } /** * 初始化数据 */ private static void initData(){ list = new ArrayList(); 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(); deleted.add("h"); deleted.add("e"); } /**index 方式删除 * @param list * @param deleted */ private static void listRemoveByIndex(List list, Set deleted){ String string; for(int i =0 ;i list, Set deleted){ Iterator it = list.iterator(); String string; while (it.hasNext()) { string = (String) it.next(); if(deleted.contains(string)){ it.remove(); } } } }