list

来源:互联网 发布:大图打印 软件 编辑:程序博客网 时间:2024/06/07 06:48

直接使用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整个程序仍然花费二次时间。

原创粉丝点击