在某些情况下,我们使用循环以方便,但也可以“手动”执行某些操作,例如从我的应用程序处理MenuItem
:
我创建了一个MenuItem
的小数组,然后使用增强的for
循环遍历它。
MenuItem[] fileActionsToLock ={ mMenu.findItem(R.id.action_share),
mMenu.findItem(R.id.action_rename),
mMenu.findItem(R.id.action_copy),
mMenu.findItem(R.id.action_move) };
for (MenuItem i : fileActionsToLock) {
i.setEnabled(false);
i.getIcon().setAlpha(100);
}
我将值分别应用于每个MenuItem
。
mMenu.findItem(R.id.action_share).setEnabled(false);
mMenu.findItem(R.id.action_share).getIcon().setAlpha(100);
mMenu.findItem(R.id.action_rename).setEnabled(false);
mMenu.findItem(R.id.action_rename).getIcon().setAlpha(100);
mMenu.findItem(R.id.action_copy).setEnabled(false);
mMenu.findItem(R.id.action_copy).getIcon().setAlpha(100);
mMenu.findItem(R.id.action_move).setEnabled(false);
mMenu.findItem(R.id.action_move).getIcon().setAlpha(100);
由于只有少数元素,因此性能在视觉上是相同的。
fileActionsToLock
数组和临时MenuItem
i
将在哪个时间进行垃圾回收? 答案 0 :(得分:2)
(1)我不认为任何一个人的跑动速度明显快于另一个。循环将有更多的开销(例如,请参阅下面关于需要迭代器的注释)但是应该花费大约相同的时间来完成,就好像你只是单独写出所有步骤一样。底线 - 你不会注意到差异。我使用循环因为它可能使您的代码更容易阅读。
(2)当垃圾收集的东西很难说。通常,当没有更多引用指向它时,对象将有资格进行垃圾回收。实际发生的方式和时间取决于您的个人设备的JVM正在运行的其余代码和垃圾回收。不同版本的android os有不同种类的垃圾收集器。可在此处找到Some more about garbage collectors并also here
答案 1 :(得分:1)
非循环方法肯定更快。比较标准for
循环更容易,因为我们确切地知道发生了什么,因此我将以此为例。当循环开始时,我们声明变量检查条件是否满足,然后运行第一个代码块。在运行第一个代码块之后,我们在检查条件然后重复之前运行一个语句。
所有这些额外内容(声明一个额外的变量,检查条件并运行最终语句)都不会出现在第二个示例中。少发生,所以它总是会更快。也就是说,这些额外的操作对于现代计算机来说花费的时间或精力很少,实在不值得担心。差异可以忽略不计。如此之小,以至于它们不太可能对您的应用产生任何影响。即使foreach
循环比for
循环快,仍然会执行不在您的手动示例中的操作。
当决定何时使用一个或另一个时,您应该使用的标准是可读性,功能性,可扩展性等。读取循环更容易,并且代码更少。循环可用于动态检查条件,使其更具功能性。最后,循环更具可扩展性。您可以稍后在循环数组中添加更多Object
,而无需更改代码。
至于垃圾收集,应该没有任何区别。在任何可访问和运行的代码中都没有对它们的引用时,它们都有资格进行收集。
答案 2 :(得分:0)
您可以阅读in this article。手动方式通常比循环增强更快,因为它不会调用迭代器上的任何方法。它也比正常循环更快,因为它不包含跳转和递增指令 - 但这不是一个真正的问题,因为没有人会对元素的几何元素进行手动操作以从CPU获得几毫秒。