在某些情况下,我们使用一个循环为方便起见,也可以“手动”执行一些操作,例如从我的应用程序处理MenuItem
S:增强的for循环VS处理对象手动
我创建了一个
MenuItem
s,然后使用增强的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
将被垃圾收集?
由于不需要像增强for循环那样创建迭代器,因此手册的速度会更快。它并没有真正有所作为,特别是在这种情况下只有很少的项目。不过,使用for循环的+1。明显更容易和更好地扩展。 –
循环展开是一种常见的优化,比将语句组合成循环容易。把它写成一个循环不仅更加清晰,而且还将JVM的展开决策留给了JVM,JVM拥有更多关于运行时环境的数据。 –
具有JIT的JVM不会自行展开循环吗?迭代器将创建更多的开销,并在创建它时最初放慢整个过程,但我不知道实际代码将在循环的外侧执行得更快。 – Rarw