寫程式碼時,編譯器比你聰明

滕瑞發表於2016-04-28

學姐起的標題,搶先用一下。

在《Effective Java》第51條:“當心字串連線的效能”一文中介紹的原則是:不要使用字串連線操作符來合併多個字串,除非效能無關緊要。相反,應該使用StringBuilder的append方法。

所以我一直以為應該儘量使用StringBuilder。直到今天review學姐的程式碼後才發現並非總是如此。

直接上測試程式碼(儲存成Demo.java):

public class Demo{
    public static void main(String[] args) {
        String a = "a" + "b" + "c";
        StringBuilder sb = new StringBuilder();
        String b = sb.append("d").append("e").append("f").toString();

        System.out.println(a);
        System.out.println(b);
        return;
    }
}

編譯後再檢視位元組碼(編譯方法:javac Demo.java,反編譯的方法:javap -c Demo): enter image description here

可以看出,編譯器直接合並了"a" + "b" + "c"變成“abc”,而StringBuilder還需要呼叫3次才行。

雖然沒有實際驗證舊版本的編譯器,但我猜想,早期的編譯器並沒有這麼智慧,所以Effective Java裡面的建議在當時是正確的。但隨著編譯器的進化,書上發現的那些陷阱和缺陷已經被修正,反而書上的有些內容變得過時和錯誤了。

結論:

  1. 編譯器的目的就是讓程式設計變得越來越容易,因為做編譯器的那些人比一般的程式設計師更聰明。
  2. 技術書籍過時太快,或者說技術本身過時就很快。
  3. 人生苦短,還是趕快用Python吧。

相關文章