Java For循環(huán)的十一種優(yōu)化方案!
你知道的越多,不知道的就越多,業(yè)余的像一棵小草!
你來,我們一起精進(jìn)!你不來,我和你的競(jìng)爭(zhēng)對(duì)手一起精進(jìn)!
編輯:業(yè)余草
推薦:https://www.xttblog.com/?p=5261
Java For 循環(huán)的常見寫法和優(yōu)化方式,總結(jié)——些值得一看的提高效率小妙招!

前言
?我們都經(jīng)常使用一些循環(huán)耗時(shí)計(jì)算的操作,特別是 for 循環(huán),它是一種重復(fù)計(jì)算的操作,如果處理不好,耗時(shí)就比較大,如果處理書寫得當(dāng)將大大提高效率,下面總結(jié)幾條 for 循環(huán)的常見優(yōu)化方式。
?
首先,我們初始化一個(gè)集合 list,如下:
List<String> list = new ArrayList<String>();
方法一:最常規(guī)的不加思考的寫法
優(yōu)點(diǎn):較常見,易于理解。
缺點(diǎn):每次都要計(jì)算list.size()。
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
方法二:數(shù)組長(zhǎng)度提取出來
針對(duì)第一種方法的缺點(diǎn),大多數(shù)程序員的解決方案是把list.size()計(jì)算給抽取出來。
int m = list.size();
for (int i = 0; i < m; i++) {
System.out.println(list.get(i));
}
優(yōu)點(diǎn):不必每次都計(jì)算
缺點(diǎn):
m 的作用域不夠小,違反了最小作用域原則 不能在 for 循環(huán)中操作 list 的大小,比如除去或新加一個(gè)元素
方法三:數(shù)組長(zhǎng)度提取出來
for (int i = 0, n = list.size(); i < n; i++) {
System.out.println(list.get(i));
}
優(yōu)點(diǎn):不必每次都計(jì)算 ,變量的作用域遵循最小范圍原則
缺點(diǎn):
i 和 n 的作用域是縮小了,但是多出了一個(gè)變量 不能在 for 循環(huán)中操作 list 的大小,比如除去或新加一個(gè)元素
方法四:采用倒序的寫法
優(yōu)點(diǎn):不必每次都計(jì)算 ,變量的作用域遵循最小范圍原則
缺點(diǎn):
結(jié)果的順序會(huì)反 看起來不習(xí)慣,不易讀懂
適用場(chǎng)合:與顯示結(jié)果順序無關(guān)的地方,比如保存之前數(shù)據(jù)的校驗(yàn)等。
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
方法五:i++ 改為 ++i
優(yōu)點(diǎn):前置版本的遞增運(yùn)算符避免了不必要的工作,它把值加1后直接返回改變了的運(yùn)算對(duì)象。
缺點(diǎn):使用起來不一定習(xí)慣。
for (int i = 0, n = list.size(); i < n; ++i) {
System.out.println(list.get(i));
}
方法六:Iterator 遍歷
優(yōu)點(diǎn):簡(jiǎn)潔
for (Iterator<String> it = list.iterator(); it.hasNext();) {
System.out.println(it.next());
}
方法七:jdk1.5 新寫法
優(yōu)點(diǎn):簡(jiǎn)潔結(jié)合泛型使用更簡(jiǎn)潔
缺點(diǎn):jdk1.4 向下不兼容,語(yǔ)法糖模式,性能不夠好
for (Object o : list) {
System.out.println(o);
}
方法八:循環(huán)嵌套外大內(nèi)小原則
從外至里,循環(huán)對(duì)象 size 要從小到大。
for (int i = 0; i < 100000; i++) {
for (int j = 0; j < 10; j++) {
}
}

方法九:循環(huán)嵌套提取不需要循環(huán)的邏輯
優(yōu)化前:
int a = 10, b = 11;
for (int i = 0; i < 10; i++) {
i = i * a * b;
}
優(yōu)化后:
int c = a * b;
for (int i = 0; i < 10; i++) {
i = i * c;
}
方法十:異常處理寫在循環(huán)外面
for (int i = 0; i < 10; i++) {
try {
} catch (Exception e) {
}
}
異常在循環(huán)外
try {
for (int i = 0; i < 10; i++) {
}
} catch (Exception e) {
}
分析:捕獲異常是很耗資源的,所以不能將try catch放到循環(huán)內(nèi)部,優(yōu)化后同樣有好幾個(gè)數(shù)量級(jí)的提升
方案十一:循環(huán)條件使用<要快于<=,>和>=同理
這個(gè)就不具體列舉案例了。。。
