zoukankan      html  css  js  c++  java
  • 关于Java优质代码的那些事

          以前别人告诉我,代码都是粘贴复制,然后写多了,就有了自己的思想,然后1,2年过去了,我的代码质量并没有什么提高,问了一些博客园里的前辈,前辈们都是语重心长的说:"少年,多看书呀!",我只当是敷衍我。知道我无意中看到一篇博客面试感悟----一名3年工作经验的程序员应该具备的技能,然后结实了大师哥:5月的仓颉,然后拜读了他的另一篇文章:给Java程序猿们推荐一些值得一看的好书,我一口气买了他文章里说的《Java多线程编程核心技术》,《Effective Java中文版》,《深入分析Java Web技术内幕》,《大型网站技术架构 核心原理与案例分析》,《Spring源码深度解析》,没有全部买下,主要是外文书理论比较强烈,我理解能力和兴趣不太感冒咬文嚼字。虽然还没看完,但是我坚持着,我一下子感觉到什么叫做优质代码。

           有人说,去看java源代码呀,可能个人性格使然吧,不是那种拔尖的人才,能慢慢咀嚼枯燥无味的源码,还是靠依赖大神的文章带着我去看源码,这样进度慢点,但是我觉得适合我,我能学到东西,有所沉淀。扯远了,这边随笔的目的,主要是告我自己,这些代码,我以后也可以尝试着用,代码看起来不是那么low。

    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

    然后使用后的效果就比较明显:

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

  • 相关阅读:
    js小程序
    事务的概念
    为期一个月培训的总结
    软件测试培训总结篇2
    软件测试培训总结篇1
    软件测试培训第30天
    软件测试培训第29天
    软件测试培训第28天
    软件测试培训第26天
    软件测试培训第27天
  • 原文地址:https://www.cnblogs.com/Profound/p/6693903.html
Copyright © 2011-2022 走看看