1. 程式人生 > >java程式碼與mysql語句的一些優化

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.欄位名1a.欄位名2a.欄位名3,b.欄位名1,b.欄位名2 from a, b where a.id = b.id;
select  a.欄位名1a.欄位名2a.欄位名3,c.欄位名1,c.欄位名2   from a, c  where a.id = c.id;

後來在同事的幫助下才知道還能這麼寫:

select  a.欄位名1a.欄位名2a.欄位名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的區別,大家去百度一下好了,寫的很詳細的。
自己碰到的一些坑暫時就這些,以後遇著會再記錄下來。