關於Java優質代碼的那些事

      之前別人告訴我,代碼都是粘貼複製,而後寫多了,就有了本身的思想,而後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;
            // 這裏初始化代碼....
        }
}
View Code

而後使用後的效果就比較明顯:ide

1 private AtomicBoolean done_ = new AtomicBoolean(false);
2 
3     public void init()
4     {
5         if( done_.compareAndSet(false, true) )
6         {
7             // 這裏放置初始化代碼....
8         }
9     }
View Code

 

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. 待續,我會持續更新,對本身代碼質量有提交的代碼段子,在這個隨筆裏面的,系但願有人扶正個人錯誤表達

相關文章
相關標籤/搜索