list

直接使用Iterator一个基本法则:若对正在被迭代的集合进行结构上的改变(add、remove、clear),则迭代器就不再合法。这意味着只有在需要立即使用一个迭代器的时候才应该获取迭代器。如果迭代器调用了自己的remove方法,则迭代器仍是合法的。

在表的前端添加项来构造一个list,LinkedList的运行时间是O(N),ArrayList的运行时间是O(N^2),因为在ArrayList在前端添加是一个O(N)操作。在LinkedList中对get的调用是O(N)操作。但是使用一个增强的for循环,则它对任意的List运行时间都是O(N),因为迭代器有效的从一项到下一项推进。

 对搜索而言,两者都是低效的,对Collection的contains和remove方法的调用都消耗线性时间。

public static void removeEvensVer2(List <Integer> lst)

{

   for (Integer x : lst)

        if (x  % 2 == 0)

            lst.remove(x);

}

在上述的算法中会产生异常。因为当一项被删除后,有增强的for循环所使用的基础迭代器是非法的。

public static void removeEvensVer3(List <Integer> lst)

{

   Iterator <Integer> itr = lst.iterator();

  while (itr.hasNext())

    if (itr.next() % 2 == 0)

       itr.remove();

}


上述算法对LinkedL而言程序消耗的是线性时间;但是对于一个ArrayList,其remove方法是仍然是昂贵的,对于ArrayList整个程序仍然花费二次时间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值