之前別人告訴我,代碼都是粘貼複製,而後寫多了,就有了本身的思想,而後1,2年過去了,個人代碼質量並無什麼提升,問了一些博客園裏的前輩,前輩們都是語重心長的說:"少年,多看書呀!",我只當是敷衍我。知道我無心中看到一篇博客面試感悟----一名3年工做經驗的程序員應該具有的技能,而後結實了大師哥:5月的倉頡,而後拜讀了他的另外一篇文章:給Java程序猿們推薦一些值得一看的好書,我一口氣買了他文章裏說的《Java多線程編程核心技術》,《Effective Java中文版》,《深刻分析Java Web技術內幕》,《大型網站技術架構 核心原理與案例分析》,《Spring源碼深度解析》,沒有所有買下,主要是外文書理論比較強烈,我理解能力和興趣不太感冒咬文嚼字。雖然還沒看完,可是我堅持着,我一會兒感受到什麼叫作優質代碼。html
有人說,去看java源代碼呀,可能我的性格使然吧,不是那種拔尖的人才,能慢慢咀嚼枯燥無味的源碼,仍是靠依賴大神的文章帶着我去看源碼,這樣進度慢點,可是我以爲適合我,我能學到東西,有所沉澱。扯遠了,這邊隨筆的目的,主要是告我本身,這些代碼,我之後也能夠嘗試着用,代碼看起來不是那麼low。java
1.使用 AtomicBoolean 高效併發處理 「只初始化一次」 的功能要求:程序員
可能會AtomicBoolean 這個對我來講,我都不知道這個啥意思,面試
對於官方的說明是:編程
能夠用原子方式更新的 boolean 值。有關原子變量屬性的描述,請參閱 java.util.concurrent.atomic
包規範。AtomicBoolean 可用在應用程序中(如以原子方式更新的標誌),但不能用於替換 Boolean。多線程
換一句話說,Atomic就是原子性的意思,即可以保證在高併發的狀況下只有一個線程可以訪問這個屬性值。架構
假設不使用AtomicBoolean ,代碼以下:併發
public static volatile initialized = false; public void init(){ if( initialized == false ){ initialized = true; // 這裏初始化代碼.... } }
而後使用後的效果就比較明顯:ide
1 private AtomicBoolean done_ = new AtomicBoolean(false); 2 3 public void init() 4 { 5 if( done_.compareAndSet(false, true) ) 6 { 7 // 這裏放置初始化代碼.... 8 } 9 }
2.儘量不要在For遍歷中建立對象引用高併發
很顯然,建立對象意味着須要分配內存,一把當心,內存就爆了,哈哈,解決方法,我摘了師兄的
1 for (int i = 1; i <= count; i++) 2 { 3 Object obj = new Object(); 4 } 5 6 //優化方法 7 8 Object obj = null; 9 for (int i = 0; i <= count; i++) 10 { 11 obj = new Object(); 12 }
3.要不要初始化HashMap的容量
1 public static void main(String[] args) { 2 3 long l1 = System.currentTimeMillis(); 4 for (int i=0;i<10000000;i++){ 5 // Map<String, String> FileName = new HashMap<String, String>();//26 23 32 6 // Map<String, String> FileName = new HashMap<String, String>(5);//86 41 29 7 Map<String, String> FileName = new HashMap<String, String>(18);//25 29 24 8 } 9 10 11 System.out.println(System.currentTimeMillis()-l1); 12 }
我測試了3種狀況,一種是默認的int capacity=16;一種是小於16,一種是大於16,跑了3次,所耗時間如右側註釋,得出結論以下,
若是給定的capacity<16時反而會增長建立對象的所需時間;
>=16時,給定一個初始化值,顯然比默認的更加快。
4.要不要初始化HashMap的內容
1 public static void main(String[] args) { 2 3 long l1 = System.currentTimeMillis(); 4 //1044 5 /* for (int i=0;i<10000000;i++){ 6 Map<String, String> FileName = new HashMap<String, String>(){ 7 { 8 put("1", "66"); 9 put("2", "deptAnnualSummary"); 10 } 11 }; 12 }*/ 13 14 //1107 15 /*for (int i=0;i<10000000;i++){ 16 Map<String, String> FileName = new HashMap<String, String>(); 17 FileName.put("1", "66"); 18 FileName.put("2", "deptAnnualSummary"); 19 }*/ 20 21 22 System.out.println(System.currentTimeMillis()-l1); 23 }
如上2種代碼,一種是初始化的時候給HashMap賦值,一種則是咱們經常看到的那種,我也反覆測了幾回性能,初始化賦值顯然要優於另外一種.
第一種方式一鼓作氣,定義了一個匿名內部類(Anonymous Inner Class),而後匿名內部類中再實例化一個代碼塊,即實例初始化塊 (instance initializer block),在類構造時執行這個塊。
推薦第一種
5.Java Stream for each如何用index
eg:循環List ,取第一個,並修改它屬性,在不破壞streams 的優雅編碼風格前提下,略感棘手,那麼如今解決方法來了
1 List<MemberFollowUpRecordVO> params = Lists.newArrayList(); 2 IntStream.range(0, params.size()) 3 .forEach(idx -> 4 query.bind( 5 idx, 6 params.get(idx) 7 ) 8 ) 9 ;
6. 待續,我會持續更新,對本身代碼質量有提交的代碼段子,在這個隨筆裏面的,系但願有人扶正個人錯誤表達