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、在不做編譯優化的情況下,在循環中,循環條件會被反覆計算,如果不使用複雜表達式,而使循環條件值不變的話,程序將會運行的更快。
- import java.util.vector;
- class cel {
- void method (vector vector) {
- for (int i = 0; i < vector.size (); i++) // violation
- ; // ...
- }
- }
- class cel_fixed {
- void method (vector vector) {
- int size = vector.size ()
- for (int i = 0; i < size; i++)
- ; // ...
- }
- }
6、將try/catch塊移出循環
把try/catch塊放入循環體內,會極大的影響性能,如果編譯jit被關閉或者你所使用的是一個不帶jit的jvm,性能會將下降21%之多!
例子:
- 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;
- }
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塊移出循環
- void method (fileinputstream fis) {
- try {
- for (int i = 0; i < size; i++) {
- _sum += fis.read();
- }
- } catch (exception e) {}
- }
在循環體中實例化臨時變量將會增加內存消耗
例子:
- 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);
- }
- }
- }
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);
}
}
}
更正:
在循環體外定義變量,並反覆使用
- import java.util.vector;
- public class loop {
- void method (vector v) {
- object o;
- for (int i=0;i<v.size();i++) {
- o = v.elementat(i);
- }
- }
- }
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;}}
所謂懶加載(lazy)就是延時加載,延遲加載。當兩個及以上表使用hibernate來管理級聯關係時,一個表(主表A)被加載到jvm內存時,其相關表(從表B)可以暫存在數據庫的緩存中,當需要使用相關表(B)數據時再加載到jvm內存中,通過懶加載機制可以減少內存中不必要的開銷,以提高程序的性能。
需要注意的是,當使用懶加載時,如果將session關閉,則斷開了與數據庫的連接,此時如果要訪問子表數據,由於子表數據是存放在數據庫的緩存中,而連接已經關閉,則訪問子表數據會拋出LazyInitializationException異常。
注意:當我們需要B表數據時,通過懶加載把B表的數據加載出來了,如果這時再關閉session,此時A表中的B表數據還是有的。因爲你取出B時就已經把B表的數據賦給A了,而不需要在從session中查找關聯關係,從庫中取數據