arraylist java 遍历删除_java ArrayList遍历删除效率对比

最近在程序中使用到了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(); } } } }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值