程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> Java----代碼優化篇,java----代碼

Java----代碼優化篇,java----代碼

編輯:JAVA綜合教程

Java----代碼優化篇,java----代碼


一、咱們之所以這麼干的目的:  

  1.效率(最重要)

  2.可讀性,便於後期維護。(同樣很重要)

 

二、代碼優化的要求:

  1.減小代碼的體積。

  2.提高代碼的運行效率。

 

三、常用的代碼的優化:

  1、盡量重用對象

    特別是String對象的重用。最常用的就是字符串的拼接:

        當遇到頻繁擦拼接String時。記住一定用StringBuilder/StringBuffer

    例如:

復制代碼
1     ArrayList<String> list;
2     //省去list初始化。
3     StringBuilder builder = new StringBuilder();
4     
5     for (String s : list) {
6         builder.append(s);
7     }
8     String result = builder.toString();
復制代碼

    原因:Java虛擬機不僅要花時間生成對象,而且還要花時間處理和回收對象,生成過多對象必定會給程序性能帶來影響。

                
  2. 盡可能使用局部變量 :

    局部變量在棧中創建,創建速度快,用完即自動消失,不需要額外的垃圾回收。

    而靜態變量、實例變量等在堆中創建,創建速度慢,同時還依賴Java垃圾回收機制處理。
       

  

  3. 及時關閉流 :

    Java程序開發中,在對I/O,數據庫操作結束後,一定要記住關閉流。

    原因:未關閉流會對系統造成很大的開銷,甚至會對數據造成嚴重的後果。
            
     

  4. 使用懶加載

    懶加載 : 當要用的時候才創建該對象。

    例如:
           

1     String prefix = "gebi";
2     
3     if ("laowang".equals(name)) {
4         list.add(prefix + name);
5     }

           替換為:

1     if("laowang".equals(name)) {
2         String prefix = "gebi";
3         list.add(prefix + name);
4     }

                      

  5.避免在循環中使用try...catch,在循環外層使用try...catch
            
  

  6.try...catch不宜太大。

    不要將無用代碼,即不會拋出異常的代碼統統放入try...catch塊中,減小try...catch代碼塊的大小。

    保證代碼的可讀性,易維護性,健壯性。

  

  7.循環內盡量避免創建對象的引用。

    尤其是循環量大的時候。

1     while (i<1000) {
2         Object object = new Object();
3     }

            建議修改為:

1     Object object = null;
2             
3     while (i<1000) {
4         object = new Object();

    每次new Object()的時候,Object對象引用指向Object對象。

    當循環次數多的時候,如第一種,JVM會創建1000個對象的引用,而第二種內存中只有一份Object對象引用。這樣就大大節省了內存空間了。
           

  8.不要隨意使用static變量。

    當對象被聲明為static的變量所引用時,此時,Java垃圾回收器不會清理這個對象所占用的堆內存。

    靜態變量所占用的堆內存直到該變量所在類所在程序結束才被釋放。 即靜態變量生命周期=類生命周期。
        
     

  9.不要創建一些不使用的對象,不要導入一些不使用的類。
        
     

  10.使用帶緩沖的I/O流:

    帶緩沖的I/O流可以極大提高I/O效率。BufferedWriter, BufferedReader, BufferedInputStream, BufferedOutputStream。
        
     

  11.包裝類數據轉換為字符串使用: toString  

    Integer i = 1;

     包裝類數據轉換為字符串方法速度排名 :

       i.toString > String.valueOf(i) > "" + i  

  

  12.Map遍歷效率 : entrySet > keySet

復制代碼
 1     //entrySet()
 2     for (Entry<String, String> entry : map.entrySet()) {
 3         String key = entry.getKey();
 4         String value = entry.getValue();
 5         System.out.println(key + " : " + value);
 6     }
 7     
 8     //上下對比
 9     
10     //keySet()
11     for (String key : map.keySet()) {
12     String value = map.get(key);
13     System.out.println(key + " : " + value);
14     }    
復制代碼

  

  13.關於Iterator與forEach()的集合遍歷捨取。

    算法導論上說:算法是為了提高空間效率和時間效率。但往往時間和空間不能並存。

    時間效率:Iterator > forEach()

    代碼可讀性 : forEach() > Iterator
                

復制代碼
 1     //Iterator
 2     Set<Entry<String, String>> entrySet = map.entrySet();
 3     Iterator<Entry<String, String>> iter = entrySet.iterator();
 4      
 5     while (iter.hasNext()) {
 6         Entry<String, String> entry = iter.next();
 7         String key = entry.getKey();
 8         String value = entry.getValue();
 9         System.out.println(key + " : " + value);
10      } 
復制代碼

    對比:

復制代碼
1     //forEach()
2     for (Entry<String, String> entry : map.entrySet()) {
3         String key = entry.getKey();
4         String value = entry.getValue();
5         System.out.println(key + " : " + value);
6     }
復制代碼

            個人認為:當處理大數據時推薦使用Iterator遍歷集合。

         但處理小數據的話,為了可讀性和後期維護還是使用forEach()。

         兩者結合使用,都應該掌握。
           

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved