1. 程式人生 > >JAVA效能優化筆記(1)

JAVA效能優化筆記(1)

               **JAVA效能優化筆記(1)**

1.減少GC的壓力,GC是一個優先順序比較低的守護執行緒。主要是回收我們的堆記憶體
2.儘量的避免我們的new操作。
一旦我們的new操作過多,會導致GC壓力過大。因為用new操作會在堆記憶體空間開闢個記憶體空間,對於記憶體空間沒有被棧引入的話會被GC回收,增加GC的開銷。
3.String、StringBuffer、StringBuild
String內容不可變。可能很多人不太理解這個意思,就拿這個程式碼來說:

String str="hello";
str=str+" World";
System.out.println(str
);

這個輸出很顯然是Hello World。 那內容變了呀,那所謂的內容不可變是什麼意思呢?
總體來說應該這麼理解:String類物件內容不能修改,但並不代表其引用不能改變。
以上程式碼,其實從記憶體中的生成,大致如下圖:
這裡寫圖片描述
String物件內容的改變實際上是通過記憶體地址“斷開-連線”變化來完成的,而原字串中的內容並沒有任何的改變。String str = “Hello”;和str = str + ” World”;實質上是開闢了三個記憶體空間,str只是由原來指向”hello”變為指向“hello world”而已,而其原來的指向內容,是沒有改變的。
因此,在以後的開發中,若要經常修改字串的內容,請儘量少用String,因為字串的指向“斷開-連線”會大大降低效能;對於要經常修改內容的情況,建議使用:StringBuilder、StringBuffer。

StringBuffer和StringBuild的區別:
其實二個原始碼的區別不大,只不過StringBuffer裡面的方法是加入了synchrized關鍵字,也就是說執行緒安全。而StringBuild是執行緒不安全的。在不考慮對字元操作的執行緒安全時,用StringBuild的效能會比StringBuffer好。

4.for、foreach、Iterator迭代器的遍歷效率

List<Integer> list=new ArrayList<Integer>();
        for(int i=0;i<5000000;i++){
            list
.add(i); } int size=list.size(); long t1=System.currentTimeMillis(); for(int i=0;i<1000;i++){ for(int j=0;j<size;j++){ list.get(j); } } long t2=System.currentTimeMillis(); for(int i=0;i<1000;i++){ for(Integer obj:list){ } } long t3=System.currentTimeMillis(); for(int i=0;i<1000;i++){ Iterator it=list.iterator(); while(it.hasNext()){ it.next(); } } long t4=System.currentTimeMillis(); System.out.println("普通for迴圈:"+(t2-t1)); System.out.println("for-each模式:"+(t3-t2)); System.out.println("Iterator模式:"+(t4-t3));
普通for迴圈:7
for-each模式:8781
Iterator模式:421

通過以上程式碼的結果也比較清晰的瞭解到:普通for的效能是最高的,foreach模式的效能最低,而且資料多的情況下越明顯。

5.儘量使用原始型別,別用包裝類

6.synchronized方法和同步程式碼塊的選擇
這個一般就是選擇粒度的最小化,同步程式碼塊比較適合,針對某些需要同步的地方做同步。

7.instanceof 介面校驗

8.三元表示式比if else美觀且效率高

9.ArrayList、Vector、LinkedList使用場景
ArrayList:需要排序的時候,需要排序取資料的時候
LinkedList:需要刪除、新增元素的時候
Vector:有執行緒安全問題的時候用

10.transient修飾字段規避序列化持久化操作,transient臨時變數