【发布时间】:2014-01-10 22:01:31
【问题描述】:
(TLDR:为什么while循环会无限重复,而for循环总是有效?)
我正在编写一个Android 应用程序,并且有一个需要运行的Runnables 队列,然后从该队列中删除:
List<Runnable> queue = new ArrayList<Runnable>();
我想以最佳的方式做到这一点,并想到了以下算法:
synchronized(queue)
{
while(queue.size() > 0)
{
queue.remove(0).run();
}
}
这导致了错误,所以我不得不在循环之前添加这个检查:if (queue.size() > 0)(真的有必要吗?)。然而,现在这似乎陷入了一个无限循环。我不得不把我的循环改成这样,效果很好:
synchronized(queue)
{
for (int i = 0; i < queue.size(); i++)
{
queue.get(i).run();
}
queue.clear();
}
我的问题是 - 这些循环之间的低级区别是什么?为什么while循环会失败?
【问题讨论】:
-
什么是错误/异常?
-
@Massimo 没有错误。该应用程序基本上冻结了。
-
为什么多次编辑队列的内容会更好?您显示的第二个选项仅编辑队列的内容一次,因此无论如何它应该表现得更好。
-
您是否在多个线程中操作 ArrayList?它不是线程安全的类,所以如果你是,你会看到奇怪的行为。
-
@NathanielJones
clear()循环遍历ArrayList中的项目,使得这个 O(n) 时间复杂度 - 所以基本上它就像两个同时 for-循环。第一个选项只会是一次迭代。