java程式碼與mysql語句的一些優化
跟著團隊做了一個專案,開始的時候寫了一堆爛程式碼,裡面的邏輯可能除了我別人都看不懂,後來專案要提測,組長檢查程式碼時感覺我的程式碼寫的太亂,說邏輯可不可以理的相對清晰一些,程式碼寫得條理一些。於是乎,開始了生平第一次Refactoring之旅。旅途中也曾感到崩潰,好在有同事們的幫忙,都熬過來了。總結一下review過程中的一些經驗,希望自己能夠記住這些碰到的坑,也希望能幫助剛剛踏上coding這條不歸路的程式猿們。
先說java程式碼的一些優化(或者說前人的經驗)。
大家經常會用到for迴圈,迴圈時經常會與array或者list的長度進行對比,舉個栗子啊:
for(int i = 0; i < list.size(); i++) {}
這麼寫當然是可以的,但改為以下程式碼執行效率會更高些:
int j = list.size(); for(int i = 0; i < a; i++){}
這就是寫迴圈程式碼時要注意的一點:消除迴圈裡對方法的呼叫;
既然提到迴圈,就說說寫迴圈程式碼時要注意的其他地方:
1、巢狀迴圈要遵循外小內大的原則,再舉個栗子:
for(int i = 0; i < 10000; i++) {
for(int j = 0; j < 100; j ++) {}
}
這是外大內小,寫成外小內大應該是介個樣子:
for(int i = 0; i < 100; i++) {
for(int j = 0; j < 10000; j++) {}
}
兩種方法都可以實現功能,但從效率來說,當然還是建議大家遵循外小內大的原則;
2、與迴圈無關的計算放迴圈外面,還是需要舉個栗子(大家要多吃栗子,吃栗子好處多啊):
for(int i = 0; i < 10; i++) {
int a = i + 2 * 3;
}
再看看這種寫法:
int x = 2 * 3;
for(int i = 0; i < 10; i++) {
int a = i + x;
}
當然這個例子舉的有些極端,不過希望大家記住,儘量減少在迴圈裡進行不必要的運算,以提高程式的效率。
3、異常捕獲放迴圈外面, eg:
for(int i = 0; i < 10; i++) {
try{
} catch (Exception e) {
}
}
因為捕獲異常相當來說是比較耗費資源的,所以寫出下面的方式比較好:
try{
for(int i = 0; i< 10; i++){}
} catch(Exception e) {
}
既然提到迴圈,就再說一下我們經常用到的if(其實這個是組長告訴我的,為了簡化程式碼,提高效率。不過話說回來,貌似所以的優化都是為了達到這倆目的)。
我以前用到if是這麼寫的:
if(x.equals(y)) {}
然後組長說這麼寫:
if(!x.equals(y)) {}
會好點,至於為什麼我也不知道,反正就先記下了。
好了,說了些程式碼的優化,再說說sql的優化(或者說應用):
有這麼一個邏輯:
有a,b,c三個表,然後要查出a,b,c中的一些內容,一開始我是這麼寫的:
select a.欄位名1,a.欄位名2,a.欄位名3,b.欄位名1,b.欄位名2 from a, b where a.id = b.id;
select a.欄位名1,a.欄位名2,a.欄位名3,c.欄位名1,c.欄位名2 from a, c where a.id = c.id;
後來在同事的幫助下才知道還能這麼寫:
select a.欄位名1,a.欄位名2,a.欄位名3,b.欄位名1,b.欄位名2,c.欄位名1,c.欄位名2 from a
left join b on a.id = b.id
left join c on a.id = c.id
從此記下了left join的用法,至於和inner join以及right join的區別,大家去百度一下好了,寫的很詳細的。
自己碰到的一些坑暫時就這些,以後遇著會再記錄下來。