【Java筆記】自己總結的在編程中的一些小技巧

此貼不定時更新

1、 在循環中不要新建引用,放到循環外建立,循環內使用,雖然對象是存在堆裏面,但引用會壓入棧,So……

2 、同樣是循環,在設立循環條件時,不要以重複訪問對象爲條件,緩存進棧,雖然是個小細節,養成習慣總是好的,例如:

    Object[] temp=new Object[1000];
    for(int i=0,n=temp.length;i<n;i++){
        ......
    }

3、 對於final的使用,在數組上其實很沒意義,數組的引用不可再變,但是成員仍然可以變化,但是,此時數組內容也不會變,只不過變化的那個成員不再屬於數組了而已,如例

    String str="old";
    final String[] temp={str};
    // a error
    // temp=new String[3];
    str=new String("new");
    /**
     * now 
     * temp[0]=="old"
     * str=="new";
     */

如上,

4、 繼續上面,對於經常使用的常量請加上final,JVM在運行時會緩存final變量,並且在多線程的共享不需要增加同步開銷,不可變性相對就提高了安全性。

5、 說到多線程,對於同步synchronized關鍵字,儘量使用同步代碼塊,不要同步方法,synchronized實現原理自行百度,總之synchronized同步的代碼越少越好。

6、 如果僅僅是一個變量的同步請不要使用同步代碼塊,直接用volatile修飾變量即可。

7、 繼續線程安全,在我們平時碼代碼是時,除非明確要求使用線程安全類,不然別去使用,線程安全類就是增加了同步開銷,以StringBuffer和StringBuilder爲例,前者屬於線程安全,但實際情況下我們使用需要線程安全的情況微乎其微(至少我沒遇到),所以StringBuilder更爲效率。

8、 繼續StringBuilderx相關,在字符串拼接,不要直接使用+拼接,此種方法效率最差,而字符串的concat方法實質就是現分解爲char數組,在複製重新生成字符串,效率只比+好一點,StringBuilder和StringBuffer通常選取前者最爲拼接字符串的優先考慮。

9、 接上面,String 重載了+ 和 +=,但是在字符串用+連接時,實質JVM運行也是編譯了一個臨時的StringBuilder來執行append,也就是說,即使你用了+,其實還是用的StringBuilder,只不過是由JVM代替了你使用而已。

10、 在循環內除非必要,否則不要處理異常,原因在於異常基類Throwable中的public synchronized native Throwable fillInStackTrace(),如你所見,是個同步方法,So……。

11、 接上,儘量不要使用try-catch處理業務流程,雖然看起來更OOP,但是實質上是try-catch的性能處理上肯定不如傳統的if-else,雖然看起來只是一點點性能的浪費。

12、 對於確定的死循環,for(;;)優於while(true),原因在於前者編譯後執行的彙編代碼更少,如例:
    for(;;)

jmp wmain+29h

    while(true)

mov eax,1
test eax,eax
je wmain+29h
jmp wmain+1Eh

13、 在傳統的大小判斷上,儘量直接使用(x>y)而非(x-y>0),試想一下x=MAX,y=MIN,如果相減是否會溢出呢?

14、 foreach語法能夠遍歷任何實現了Iterable接口的類。

15、 多看書吧,雖然可能情況不同,我在學習中只看過唯一一次視頻,一個簡單的知識點拖了一大截纔講到關鍵,看書幾下就看明白了,無論看書還是視頻,重要的不是看,是練。

16、 《Java編程思想》真的是本很不錯的書(機械工業大法好),相比於國內的某些書(我深受其害),這本書讓我欲罷不能,每重看一遍,總有不一樣的領悟。

17、 泛型有坑(萬惡的泛型擦除),但泛型好用,特別是在編寫自己的類庫的時候,泛型總能讓你的類庫突出某層侷限。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章