java開發總結

1、字符串函數substring(beginIndex, endIndex):是衝beginIndex開始包括beginIndex),到endIndex但不包括endIndex)。


2、字符串函數substring(beginIndex,beginIndex):取值爲空。

例如String tempStr = "sdfsdf".substring(0,0); (tempStr的值爲空"")。


3、Object tempObj = map.get("ss"),而map中並沒有此key時,此句不會報異常(tempObj=null)


4、程序中寫查詢sql時,儘量不用*(select * from tableName),而是要吧查詢的字段都寫出來,因爲根據數據的查詢規則使用*進行查詢時的效率要慢。(具體規則忘了)


5、在不做編譯優化的情況下,在循環中,循環條件會被反覆計算,如果不使用複雜表達式,而使循環條件值不變的話,程序將會運行的更快。 

  1. import java.util.vector;  
  2. class cel {  
  3.     void method (vector vector) {  
  4.         for (int i = 0; i < vector.size (); i++)  // violation  
  5.             ; // ...  
  6.     }  
  7. }  
更正: 
  1. class cel_fixed {  
  2.     void method (vector vector) {  
  3.         int size = vector.size ()  
  4.         for (int i = 0; i < size; i++)  
  5.             ; // ...  
  6.     }  
  7. }  


6、將try/catch塊移出循環 

把try/catch塊放入循環體內,會極大的影響性能,如果編譯jit被關閉或者你所使用的是一個不帶jit的jvm,性能會將下降21%之多! 

例子:         

  1. import java.io.fileinputstream;  
  2. public class try {  
  3.     void method (fileinputstream fis) {  
  4.         for (int i = 0; i < size; i++) {  
  5.             try {                                      // violation  
  6.                 _sum += fis.read();  
  7.             } catch (exception e) {}  
  8.         }  
  9.     }  
  10.     private int _sum;  
  11. }  

import java.io.fileinputstream;
public class try {
    void method (fileinputstream fis) {
        for (int i = 0; i < size; i++) {
            try {                                      // violation
                _sum += fis.read();
            } catch (exception e) {}
        }
    }
    private int _sum;
}

   
更正:         
將try/catch塊移出循環 

  1. void method (fileinputstream fis) {  
  2.        try {  
  3.            for (int i = 0; i < size; i++) {  
  4.                _sum += fis.read();  
  5.            }  
  6.        } catch (exception e) {}  
  7.    }  


7、不要在循環體中實例化變量 

在循環體中實例化臨時變量將會增加內存消耗 


例子:  
  1. import java.util.vector;  
  2. public class loop {  
  3.     void method (vector v) {  
  4.         for (int i=0;i < v.size();i++) {  
  5.             object o = new object();  
  6.             o = v.elementat(i);  
  7.         }  
  8.     }  
  9. }  
import java.util.vector;
public class loop {
    void method (vector v) {
        for (int i=0;i < v.size();i++) {
            object o = new object();
            o = v.elementat(i);
        }
    }
}

         
更正:         
在循環體外定義變量,並反覆使用 
 
       
  1. import java.util.vector;  
  2. public class loop {  
  3.     void method (vector v) {  
  4.         object o;  
  5.         for (int i=0;i<v.size();i++) {  
  6.             o = v.elementat(i);  
  7.         }  
  8.     }  
  9. }  


8、序列化(fastjson序列化get方法的執行)

        實體類中的非public、static屬性都會被序列化。

        而序列化的過程中會自動調用屬性的get方法(個人認爲是取該屬性的值進行序列化):已驗證

        反序列的過程中會自動調用屬性的set方法(個人認爲是爲該對象的屬性賦值):未驗證

      例如:序列化類Teacher object

   在執行JSON.toJSONString(object)此句中就會調用該對象屬性的get方法,
	序列化後該屬性的值是get方法的返回值

public class Teacher {
        private int id;
        private List<Student> students;
        public BaseTestItemGroup() {
        }
        public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
        public List<Student> getStudents() {
		//在此可以加入一些邏輯處理,在序列的時候會自動執行(已驗證)
		/*
		*邏輯處理代碼(省略)
		*/	
		return students;
	}
	public void setStudents(List<Student> students) {
		//在此可以加入一些邏輯處理,在反序列的時候會自動執行(爲驗證)
		/*
		*邏輯處理代碼(省略)
		*/
		this.students = students;}}


9、Hibernate session lazy

  所謂懶加載(lazy)就是延時加載,延遲加載。當兩個及以上表使用hibernate來管理級聯關係時,一個表(主表A)被加載到jvm內存時,其相關表(從表B)可以暫存在數據庫的緩存中,當需要使用相關表(B)數據時再加載到jvm內存中,通過懶加載機制可以減少內存中不必要的開銷,以提高程序的性能。

    需要注意的是,當使用懶加載時,如果將session關閉,則斷開了與數據庫的連接,此時如果要訪問子表數據,由於子表數據是存放在數據庫的緩存中,而連接已經關閉,則訪問子表數據會拋出LazyInitializationException異常。

注意:當我們需要B表數據時,通過懶加載把B表的數據加載出來了,如果這時再關閉session,此時A表中的B表數據還是有的。因爲你取出B時就已經把B表的數據賦給A了,而不需要在從session中查找關聯關係,從庫中取數據

 
發佈了29 篇原創文章 · 獲贊 8 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章