关于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. 待续,我会持续更新,对本身代码质量有提交的代码段子,在这个随笔里面的,系但愿有人扶正个人错误表达

相关文章
相关标签/搜索