use*_*647 10 java foreach for-loop android-studio
这个问题一直困扰着我.为什么Android Studio有时会让我使用For Each而不是For Loop,因为当我使用For循环时,我会收到一个警告,我可以为每个使用(并且使用Alt + Enter它会建议我使用自动修复).
例如,假设我们有这个代码
String a = "";
String[] array = {"A","B","C"};
for(int i = 0; i < array.length; i++) {
a += array[i];
a += ",";
}
Run Code Online (Sandbox Code Playgroud)
我收到警告
这是Android Studio建议的修复程序
for (String anArray : array) {
a += anArray;
a += ",";
}
Run Code Online (Sandbox Code Playgroud)
性能更高吗?有一个原因我应该得到一个警告,实际上只使用for循环?
或者什么时候循环或每个循环更好?
Rid*_*hvi 26
来自Joshua Bloch的书:Effective Java(第2版)
在1.5版中引入的for-each循环通过完全隐藏迭代器或索引变量来消除混乱和错误的机会.由此产生的习语同样适用于集合和数组:
// The preferred idiom for iterating over collections and arrays
for (Element e : elements) {
doSomething(e);
}
Run Code Online (Sandbox Code Playgroud)
当您看到冒号(:)时,将其读作"in".因此,上面的循环读作"对于元素中的每个元素e".请注意,使用for-each循环没有性能损失,即使对于数组也是如此.实际上,在某些情况下,它可能比普通的for循环提供轻微的性能优势,因为它只计算一次数组索引的限制.虽然您可以手动执行此操作(第45项),但程序员并不总是这样做.
以下是http://developer.android.com/training/articles/perf-tips.html#Loops的比较:
static class Foo {
int mSplat;
}
Foo[] mArray = ...
public void zero() {
int sum = 0;
for (int i = 0; i < mArray.length; ++i) {
sum += mArray[i].mSplat;
}
}
public void one() {
int sum = 0;
Foo[] localArray = mArray;
int len = localArray.length;
for (int i = 0; i < len; ++i) {
sum += localArray[i].mSplat;
}
}
public void two() {
int sum = 0;
for (Foo a : mArray) {
sum += a.mSplat;
}
}
Run Code Online (Sandbox Code Playgroud)
zero()是最慢的,因为JIT还不能优化通过循环每次迭代获得一次数组长度的成本.
one()是比较快的.它将所有内容都拉到局部变量中,避免了查找.只有阵列长度才能提供性能优势.
two()没有JIT的设备速度最快,one()与具有JIT的设备无法区分 .它使用Java编程语言1.5版中引入的增强型for循环语法.因此,您应该默认使用增强型for循环,但考虑一个手写的计数循环,用于性能关键的ArrayList迭代.
| 归档时间: |
|
| 查看次数: |
21295 次 |
| 最近记录: |