關(guān)鍵字: java
在java中究竟是一般的for循環(huán),還是for的增強型foreach,或是while的執(zhí)行效率比較快呢,我用了一個簡單的程序來分析3種循環(huán)
public static void main(String[] args) {
List<Integer> map = new ArrayList<Integer>();
for (int i = 0; i < 100000; i++) {
map.add(i);
}
long currTime = System.currentTimeMillis();
//基本的for
int z = map.size();
// for (int i = 0; i < z; i++) {
// int tmp = map.get(i);
// System.out.println(tmp);
// }
//foreach
// for (Integer integer : map) {
// int tmp = integer;
// System.out.println(tmp);
// }
//while
// int i = 0 ;
// while(i<z){
// int tmp = map.get(i);
// System.out.println(tmp);
// i++;
// }
//
// long time = System.currentTimeMillis() - currTime ;
// System.out.println(time);
//
// }
下面是3種循環(huán)得出的數(shù)據(jù)(時間單位為毫秒)
for foreach while
第一組比較(4次)
1313 1329 1219
1266 1063 1156
1078 1109 1125
1297 1047 1266
總時間
4954 4548 4766
第二組比較
1219 1125 1109
1172 1062 1188
1313 1109 1125
1125 1296 1125
總時間
4829 4592 4547
第三組比較
1265 1078 1125
1062 1062 1094
1328 1109 1094
1329 1235 1125
總時間
4984 4484 4438
從上面的數(shù)據(jù)我們可以看出foreach和while的效率幾乎是差不多的,而for則相對較慢一些。
這是不是代表著foreach可以替代掉for呢,顯然不是foreach的內(nèi)部原理其實還是 Iterator
但它不能像Iterator一樣可以人為的控制,而且也不能調(diào)用iterator.remove();更不能使用下標來方便的訪問元素.
foreach這種循環(huán)一般只適合做數(shù)組的遍歷,提取數(shù)據(jù)顯示等,不適合用于增加刪除和使用下標等復(fù)雜的操作.
用一個最簡單的程序來說明用foreach來進行賦值操作造成的錯誤.
public class test {
public static void main(String[] args)
{
User[] users = new User[2];
users[0] = new User();
users[1] = new User();
// for(int i=0; i<users.length; i++)
// {
// users[i] = new User();
// }
for(User user:users)
{
user = new User();
}
System.out.println(users[0].name);
}
}
class User
{
String name = "nick";
}
第一種for循環(huán)可以正常的賦值,而第二種foreach就會報出空指針.
for循環(huán)和while循環(huán)在使用上有一定的差異,但從實現(xiàn)的效果來看都是基本一樣的。
for循環(huán)再某些方面要更優(yōu)一些如無限循環(huán) while(true) for(;;)
編譯前 編譯后
while (1); mov eax,1
test eax,eax
je foo+23h
jmp foo+18h
編譯前 編譯后
for (;;); jmp foo+23h
從編譯后的結(jié)果我們可以看出for的指令少,而且沒有判斷,顯然更快.
到底最好最差呢,其實都是相對的,根據(jù)不同的情況找到最優(yōu)的解決才是最好的.