轉(zhuǎn)帖|其它|編輯:郝浩|2010-11-04 17:26:38.000|閱讀 1817 次
概述:本文主要講解java中for foreach while循環(huán)的比較,希望對(duì)大家有幫助。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在java中究竟是一般的for循環(huán),還是for的增強(qiáng)型foreach,或是while的執(zhí)行效率比較快呢,我用了一個(gè)簡(jiǎn)單的程序來(lái)分析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ù)(時(shí)間單位為毫秒)
for foreach while
第一組比較(4次)
1313 1329 1219
1266 1063 1156
1078 1109 1125
1297 1047 1266
總時(shí)間
4954 4548 4766
第二組比較
1219 1125 1109
1172 1062 1188
1313 1109 1125
1125 1296 1125
總時(shí)間
4829 4592 4547
第三組比較
1265 1078 1125
1062 1062 1094
1328 1109 1094
1329 1235 1125
總時(shí)間
4984 4484 4438
從上面的數(shù)據(jù)我們可以看出foreach和while的效率幾乎是差不多的,而for則相對(duì)較慢一些。
這是不是代表著foreach可以替代掉for呢,顯然不是foreach的內(nèi)部原理其實(shí)還是 Iterator
但它不能像Iterator一樣可以人為的控制,而且也不能調(diào)用iterator.remove();更不能使用下標(biāo)來(lái)方便的訪問(wèn)元素.
foreach這種循環(huán)一般只適合做數(shù)組的遍歷,提取數(shù)據(jù)顯示等,不適合用于增加刪除和使用下標(biāo)等復(fù)雜的操作.
用一個(gè)最簡(jiǎn)單的程序來(lái)說(shuō)明用foreach來(lái)進(jìn)行賦值操作造成的錯(cuò)誤.
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就會(huì)報(bào)出空指針.
for循環(huán)和while循環(huán)在使用上有一定的差異,但從實(shí)現(xiàn)的效果來(lái)看都是基本一樣的。
for循環(huán)再某些方面要更優(yōu)一些如無(wú)限循環(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的指令少,而且沒(méi)有判斷,顯然更快.
到底最好最差呢,其實(shí)都是相對(duì)的,根據(jù)不同的情況找到最優(yōu)的解決才是最好的.
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載