• java代码(11) ---java代码的优化



    java代码的优化


    参考了一些Java开发手册有关代码的规范,觉得一段好的代码可以从三个维度去分析.1)性能,2)可扩展性,3)可读性

    让我们看看别人是怎么去分析,还有值得我们去学习的地方,也是我正在要求自己的条件

    一、性能考虑

    1、必须注意,不对数据库层做任何操作,如果业务的确需要,那也最后注解说明原因

    2、尽量减少对变量的重复计算

      在不做任何编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快

     for (int i=0; i< list.size(); i++)
    {.....}
    
    //建议修改为:
      for (int i=0; length =list.size(); i<length; i++)
    {.....}

    这样list.size只会调用一次,减少性能消耗

    3、尽量采用懒加载的策略,即在需要的时候才创建

     这个习惯我本人会慢慢去培养,在写逻辑的时候,尤其是创建对象的时候是否需要考虑懒加载

    例如:

        A  a= new A();
        if  (i==1)
        {
        list.add(a);
        }
    
        //建议替换为:
        if  (i==1)
        {
        A a = new A();
        list.add(a);
        }

    4、字符串的累积

     1)循环外:字符串拼接可以直接使用String的+操作,没有必要通过StringBuilder进行append

     2)  循环内:好的做法是在循环外声明StringBuilder对象,在循环内进行append,不论循环多少层都只有一个StringBuilder对象

    反编译的字节码文件显示每次循环都会new出一个StringBuilder对象,然后进行append操作,最后通过toString方法返回String对象,造成内存资源浪费

         StringBuffer sb = new StringBuffer();
         sb.append("a");
         sb.append("b");
         sb.append("c");
    
         //不在循环体内其实可以直接用加号,优化后一行代码:
         String sb="a"+"b”+"c";

    有关JDK不同版本对String拼接的优化可以参考:jdk不同版本对String拼接的优化分析

     5、尽量避免使用split

    split由于支持正则表达式,所以效率比较低

    替代

            
            String  str1="a,b,c,d,e,,g";
            //可以考虑使用apache的StringUtils.split(string,char)
            List<String> list=Arrays.asList(StringUtils.split(str,","));
            //可以考虑guava工具
            List<String> list1=Splitter.on(",").splitToList(str1);

    6、确定StringBuffer的容量

      StringBuffer的构造器会创建一个默认大小(通常是16)的字符数组,在使用中,如果超出这个大小,就会重新分配内存,创建一个更大的数组,并将原先的数组复制过来,在丢弃旧的数组,在大多数情况下,你可以在创建

    StringBuffer的时候指定大小,这样就避免了在容量不够的时候自动增长,以提高性能

    例子:

      

         
            StringBuffer  buffer = new Stringbuffer();
            buffer.append("hello");
            //更正为:为stringbuffer提供寝大小,一般循环体内使用都可以知道大小
            StringBuffer  buffer = new StringBuffer(max);
            buffer.append("hello");

    7、使用工具类Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法

    它的add/remove/clear 方法会抛出UnsupportedOperationException异常

    说明:asList的返回对象是一个Arrays内部类,并没有实现集合的修改方法,Arrays.asList体现的是适配器模式,只是转换接口,后台的数据仍是数组

        String[]   str = new String[]{"a","b"};
        List   list = Arrays.asList(str)
        //第一种情况:list.add("c");运行时异常
        //第二种情况:str[0] = "gujin"; 那么list.get(0)也会随之修改

    8、查找数组元素,可以用Arrays.asList(T[] array).contains(T obj)

    二、可读性考虑

    1、推荐尽量少用else,if-else的方式

    可以考虑:

      

        if(condition){
        ....
        return obj;
        }
        //接着写else的业务逻辑代码;

    说明:如果非得使用if()...else if()...else()..方式表达逻辑,【强制】请勿超过3层,超过请使用策略设计模式

    正例:逻辑上超过3层的if..else代码可以使用卫语句,或者状态模式来实现

    2、在if/else/for/while/do语句中必须使用大括号,即使只有一行代码

    避免使用:if(condition) statements;

    3、使用条件操作符替代"if(cond)return; else return;"结构

        //条件操作符更加的简洁
        if(isdone){
            return 0;  
        }else{
               return 0;
            }
    
        //更正
        return  (isdone?0:10);

    4、Object的equals方法容易抛出空指针异常,应使用常量或确定有值得对象来调用equals

    正例:"test".equals(Object);

    反例:Object.equals("test");

    说明:推荐使用java.util.Objects(JDK7引入的工具类)

    5、不允许出现任何魔法值(即未经定义的常量)直接出现在代码中

    反例:

        String key = "Id#taobao_"+tradeId;
        cache.put(key,value);

    6、取反操作符()降低程序的可读性,所以不要总是使用

     

     
        boolean method(boolean a, boolean b){
                if(!a)
                   return !a;
                 else
                    return !b;
        }

    7、注释掉的代码尽量要配合说明,而不是简单的注释块

      代码块被注释掉有两种可能性:1)后续会恢复此段代码逻辑,2)永久不用,前者如果没有备注信息,难以知晓注释动机,后者建议直接删掉(代码仓库保存了历史代码)

    8、特殊注释标记,请注明标记人与标记时间

      1.待办事宜(TODO)标记人,标记时间,[预处理时间] 表示需要实现,但目前还未实现的功能

      2.错误不能工作(FIXME)(标记人,标记时间,[预处理时间]在注释中用FIXME标记某代码是错误的,而且不能工作,需要及时纠正的情况)

     

  • 相关阅读:
    Invalid call to dataType on unresolved object, tree: 'goodsid的问题
    本地调试spark程序出现Please set spark.sql.hive.metastore.jars 一类配置错误的问题
    es搜索模型例子
    mysql2es全量更新方案
    利用hive-hbase表做hive表快速入库hbase功能,纬度表的查询
    运行spark报错Error while instantiating 'org.apache.spark.sql.hive.HiveSessionState'
    es常用查询学习记录
    SPSS聚类与判别
    Matlab常微分方程数值解法(1)
    Matlab拟合
  • 原文地址:https://www.cnblogs.com/zhenbian/p/12965207.html
Copyright © 2020-2023  润新知