通用的effective util

1.使用Jackson進行json 字符串和對象間的相互映射。 2.使用orika, 進行類的深度複製。 3.使用Jaxb2.0實現XML和Java Objec之間的映射。 4.Date的parse和format採用Apache Common Lang中線程安全, 性能更佳的FastDateFormat。 5.使用Murmur進行Hash計算。 6.若是使用char對字符串進行split,本身實現更高效。 7.若是是使用反射調用方法(MethodInvoke),在高性能的場景下能夠考慮使用cglib基於字節碼生成的快速反射(FastMethod),會比JDK自身的快。 8.JDK1.7以上使用ThreadLocalRandom替換Random,若是是要求更安全的隨機數使用SecureRandom 9.大量重複的出錯日誌,不但願輸出太多時可開發新的logger進行限流 10.JDK的java.io.StringWriter使用StringBuffer,可使用CommonIO包中的StringBuilderWriter進行性能改善。 11.對文件夾的遞歸遍歷等操做可使用Guava。 12.對Set的交、並、差、補能夠考慮使用Guava實現。 13.對一個範圍內的Key指向同一個Value的Map,可使用Guava。 14.對由int類型或long類型做爲key構成的Map能夠考慮Netty中的實現。 15.對Iterable的集合求TopN,bottomN等,可使用Guava 16.線程池進行優雅的關閉,可使用Guava 17.構建自定義名字的Thread,可使用Guava 18.爲了防止線程池中線程被中斷,最好是將Runnable進行封裝,提供一個更爲安全的SafeRunnable 19.使用隊列改進CachedThreadPool,本質是基於ThreadPoolExecutor進行定製,可參考Tomcat 的實現 1.使用Jackson進行json 字符串和對象間的相互映射。 說明:不要使用Gson,在對象大的時候,會比較的慢。 2.使用orika, 進行類的深度複製。 說明:不要使用Apache Common BeanUtils進行類複製,實現中有屢次使用反射反查對象的屬性,比較慢 3.使用Jaxb2.0實現XML和Java Objec之間的映射。 說明:JAXB 已是 Java SE平臺的一部分,Java EE平臺API之一。 4.Date的parse和format採用Apache Common Lang中線程安全, 性能更佳的FastDateFormat。 說明:Apache Common Lang中的版本選擇3.5之後的,由於使用了StringBuilder,而非StringBuffer。FastDateFormat對日期的format進行了cache,不會每次建立對象, 5.使用Murmur進行Hash計算。 說明:Guava裏面有實現。該算法是一種非加密型哈希函數,對於規律性較強的key,MurmurHash的隨機分佈特徵表現更良好。Guava裏面有實現。 6.若是使用char對字符串進行split,本身實現更高效。 說明:jdk自帶的split是通用的String類型的split。能夠參考Commons Lange 3.5 StringUtils中的實現,本身寫一個。本身寫的目的是進一步優化:首先是不用返回數組,能夠返回List,減小拷貝;其次是能夠指定split後的大小,減小List內容的拷貝。 7.若是是使用反射調用方法(MethodInvoke),在高性能的場景下能夠考慮使用cglib基於字節碼生成的快速反射(FastMethod),會比JDK自身的快。 說明:FastClass.create(Class),每次都建立一個新的FastClass實例,而且這個方法是有很大性能開銷的,實際中應該將fastClass的實例緩存起來(對一個類只建立一次);另外,fastMethod的invoke性能是jdk的1.5倍,主要是減小了不少權限和安全的檢測。 8.JDK1.7以上使用ThreadLocalRandom替換Random,若是是要求更安全的隨機數使用SecureRandom 說明:ThreadLocalRandom的性能比Random好;在須要頻繁生成隨機數,或者安全要求較高的時候,不要使用Random/ThreadLocalRandom,由於Random生成的值實際上是能夠預測的。另外,使用SecureRandom須要使用SHA1PRNG算法,性能更好 9.大量重複的出錯日誌,不但願輸出太多時可開發新的logger進行限流 說明:參看facebook貢獻的一個代碼,https://github.com/facebook/jcommon/blob/master/logging-util/src/main/java/com/facebook/logging/util/TimeSamplingSLF4JLogger.java 該logger在指定配置的時間內只輸出一條日誌。 10.JDK的java.io.StringWriter使用StringBuffer,可使用CommonIO包中的StringBuilderWriter進行性能改善。 說明:通常咱們用StringBuilder提高性能。 11.對文件夾的遞歸遍歷等操做可使用Guava。 說明:使用Guava的Files類的fileTreeTranverser方法。 12.對Set的交、並、差、補能夠考慮使用Guava實現。 說明:使用Guava的Sets類 13.對一個範圍內的Key指向同一個Value的Map,可使用Guava。 說明:Guava提供RangeMap來解決這類問題。Guava中還有一些特殊的Map好比MultiMap(一個key映射多個Map) 14.對由int類型或long類型做爲key構成的Map能夠考慮Netty中的實現。 說明:Netty 4.x提供了IntObjectMap和LongObjectMap,他們的實現和HashMap的實現不同,空間佔用和讀寫性能都很好! 15.對Iterable的集合求TopN,bottomN等,可使用Guava 說明:Guava的Ordering類對這些排序進行了優化。 16.線程池進行優雅的關閉,可使用Guava 說明:優雅關閉線程池可使已經提交的任務,獲得執行,在等待一段時間之後能夠進行當即關閉。Guava的MoreExecutors類進行了實現。 17.構建自定義名字的Thread,可使用Guava 說明:自定義Thread的名字能夠方便調試。Guava的ThreadFactoryBuilder提供了定義方法。 18.爲了防止線程池中線程被中斷,最好是將Runnable進行封裝,提供一個更爲安全的SafeRunnable 說明:若是Runnable的對象在執行中拋出了異常,而該異常沒有被Runnable的包裹類捕捉和處理的話,會致使線程池中的線程被中斷,從而不能繼續正常工做,這在定時執行的任務中常常會引起問題。所謂的SafeRunnable是catch了異常的Runnable,在沒法控制第三方包的Runnable實現時,可調用SafeRunnable。 19.使用隊列改進CachedThreadPool,本質是基於ThreadPoolExecutor進行定製,可參考Tomcat 的實現 說明:JDK中自帶的FixedThreadPool有Queue但線程數量不變,而CachedThreadPool線程數可變但沒有Queue,爲了更加靈活,能夠考慮基於ThreadPoolExecutor進行定製。定製的原則是爲了修復ThreadPoolExecutor自身不合理的地方:只有隊列滿了後,纔會去擴大處理的線程數。而更合理的一種方式應該是:當線程池的線程數達到最大的時候,纔將任務放入到隊列排隊處理。java

相關文章
相關標籤/搜索