Java 代碼的精優化

1、避免使用BigDecimal(double)

BigDecimal(double) 存在精度損失風險,在精確計算或值比較的場景中可能會致使業務邏輯異常。

 反例:java

// BigDecimal 反例   
    BigDecimal  decimal = new BigDecimal(11.801D);
    System.out.println("decimal:"+decimal);

正例:正則表達式

// BigDecimal 正例
    BigDecimal  bDecimal = BigDecimal.valueOf(11.801D);
    System.out.print("bDecimal:"+bDecimal);

執行結果:數據庫

    decimal:11.8010000000000001563194018672220408916473388671875
    bDecimal:11.801

2、String.split(String regex)部分關鍵字須要轉譯

使用字符串String 的plit 方法時,傳入的分隔字符串是正則表達式,則部分關鍵字(好比 .[]()| 等)須要轉義。性能

2.1 優化

String str = "small.sun.shine";
String[] strSplit = str.split(".");  // .須要轉義,反例
String[] strSplit1 = str.split("\\.");// 正例
String[] strSplit2 = str.split("[.]");// 正例
System.out.println("strSplit:" + Arrays.toString(strSplit));
System.out.println("strSplit1:" + Arrays.toString(strSplit1));
System.out.println("strSplit2:" + Arrays.toString(strSplit2));

執行結果:orm

strSplit:[]
strSplit1:[small, sun, shine]
strSplit2:[small, sun, shine]

2.2blog

String str = "small|sun|shine";
String[] strSplit = str.split("|");  // | 須要轉義,反例
String[] strSplit1 = str.split("\\|");// 正例
String[] strSplit2 = str.split("[|]");// 正例
System.out.println("strSplit:" + Arrays.toString(strSplit));
System.out.println("strSplit1:" + Arrays.toString(strSplit1));
System.out.println("strSplit2:" + Arrays.toString(strSplit2));

執行結果:索引

strSplit:[]
strSplit1:[small, sun, shine]
strSplit2:[small, sun, shine]

3、迭代entrySet() 獲取Map 的key 和value

當循環中只須要獲取Map 的主鍵key時,迭代keySet() 是正確的;可是,當須要主鍵key 和取值value 時,迭代entrySet() 纔是更高效的作法,其比先迭代keySet() 後再去經過get 取值性能更佳。ci

反例:
//Map 獲取value 反例:
HashMap<String, String> map = new HashMap<>();
for (String key : map.keySet()){
    String value = map.get(key);
}

正例:字符串

//Map 獲取key & value 正例:
HashMap<String, String> map = new HashMap<>();
for (Map.Entry<String,String> entry : map.entrySet()){
    String key = entry.getKey();
    String value = entry.getValue();
}

4、MyBatis 不要爲了多個查詢條件而寫 1 = 1

當遇到多個查詢條件,使用where 1=1 能夠很方便的解決咱們的問題,可是這樣極可能會形成很是大的性能損失,由於添加了 「where 1=1 」的過濾條件以後,數據庫系統就沒法使用索引等查詢優化策略,數據庫系統將會被迫對每行數據進行掃描(即全表掃描) 以比較此行是否知足過濾條件,當表中的數據量較大時查詢速度會很是慢;此外,還會存在SQL 注入的風險。

反例:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(*) from t_rule_BookInfo t where 1=1
<if test="title !=null and title !='' ">
 AND title = #{title} 
</if> 
<if test="author !=null and author !='' ">
 AND author = #{author}
</if> 
</select>

正例:

<select id="queryBookInfo" parameterType="com.tjt.platform.entity.BookInfo" resultType="java.lang.Integer">
 select count(*) from t_rule_BookInfo t
<where>
<if test="title !=null and title !='' ">
 title = #{title} 
</if>
<if test="author !=null and author !='' "> 
 AND author = #{author}
</if>
</where> 
</select>
相關文章
相關標籤/搜索