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