Java程式設計師的八個最佳實踐

banq發表於2021-04-30

betterprogramming文章提出了一些專家建議,這些建議將提高Java程式碼的效率。
 

1.小心使用字串
如果在一個for迴圈中使用+運算子串聯了兩個字串,則每次都會建立一個新的字串物件。
這浪費了記憶體並增加了效能時間。另外,在例項化String物件時,應避免建構函式,而應直接進行例項化。這是一些程式碼:

//
較慢的例項化

String bad = new String("Hello World");


//更快的例項化

String good = "Hello World!";

 

2.避免不必要的物件建立
物件建立是Java中最昂貴的操作(就記憶體利用率而言)。因此,建議僅在必要時才建立或初始化物件。以下程式碼給出了一個示例:

import java.util.ArrayList;
import java.util.List;

public class Books {
    private List books;
    
    public List getBooks() {
        //Initialize if required
        if(null == books) {
            books = new ArrayList();
        }
        return books;
    }
}

 

3.返回空集合而不是空
如果程式返回的集合沒有任何值,請確保返回Empty集合而不是Null元素。它將節省大量if-else 有關Null Elements的檢查。以下程式碼將幫助您:

public List getBooks() {
    if (null == books) {
        books = new ArrayList();
    }
    return books;
}

 

4.使用邏輯運算子檢查奇數
看一下下面的程式碼行,並確定它們是否可用於精確識別給定數字是否為奇數:

public boolean oddOrNot(int num) {
    return num % 2 == 1;
}


這些行看似正確,但從統計學上講,它們每四次就會返回不正確的結果。如果使用負的奇數,則除以2的餘數將不為1。因此,返回的結果將為false,這是不正確的!
可以將其修復如下:

public boolean oddOrNot(int num) {
    return (num & 1) != 0;
}


使用此程式碼,不僅可以解決負奇數的問題,而且還對程式碼進行了高度最佳化。由於邏輯運算乘法比除法快得多,因此在第二個程式碼段中可以更快地獲得結果。
 

5.避免記憶體洩漏
記憶體洩漏通常會導致軟體效能下降。由於Java自動管理記憶體,因此開發人員沒有太多控制權。但是,仍有一些標準做法可以用來保護您的應用程式免受記憶體洩漏的影響。

  • 查詢完成後,請始終釋放資料庫連線。
  • 嘗試儘可能多地使用一個Finally塊。
  • 釋放儲存在靜態表中的例項。

 

6.必要時使用手動操作
為了提高計算能力,Java提供了兩種選擇:
1.乘法:

double square = double a * double a;                            // Optimized
double cube = double a * double a * double a;                   // Non-optimized
double cube = double a * double square;                         // Optimized
double quad = double a * double a * double a * double a;            // Non-optimized
double quad = double square * double square;                    // Optimized

2. Math.pow
pow方法用於計算不可能進行乘法的地方(基數指數)

double cube = Math.pow(base, exponent);


Math.pow()僅在必要時使用。例如,如果指數是一個小數值。那是因為Math.pow()方法通常比乘法慢300-600倍。
 

7.避免對索引使用For迴圈
請不要使用帶有索引(或計數器)變數的for迴圈。通常,索引變數容易出錯,因為我們可能會在迴圈的主體中意外更改它,或者我們可能從1而不是0開始索引。
示例遍歷字串陣列:

String[] names = {"Alice", "Bob", "Carol", "David", "Eric", "Frank"};
for (int i = 0; i < names.length; i++) {
      doSomething(names[i]);
}

索引變數i在for迴圈中是改變的,這可能會導致意外結果。我們可以透過使用如下所示的增強for迴圈來避免潛在的問題:

for (String aName :names){
     doSomething(aName);
}

這不僅消除了潛在的問題,而且使程式碼更簡潔。
 

8.選擇正確的時間操作
有兩種使用Java進行時間操作的標準方法:System.currentTimeMillis()和System.nanoTime()。
問題是,您應在哪種情況下選擇哪種?原則上,它們都執行相同的操作,但在以下方面有所不同:

  1. System.currentTimeMillis()需要大約1/1000秒到15/1000秒之間的時間(取決於系統),但是System.nanoTime()大約需要1 / 1000,000秒(1,000奈米)
  2. System.currentTimeMillis()花費幾個時鐘週期執行讀取操作,而System.nanoTime()花費100個以上時鐘週期。
  3. System.currentTimeMillis()反映了絕對時間(自1970年1月1日以來的毫秒數00:00(Epoch時間)),但System.nanoTime()不一定代表任何參考點。





 

相關文章