ym——优化你的Java代码(新)

转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持!

1.面向对象的3要素。

2.面向对象开发的6大原则。

1.单一职责原则

应该有且仅有一个原因引起类的变更。

2.里氏替换原则

仅仅要父类能出现的地方,其子类就应该能出现。

也就是用子类替换父类后。保证程序照样执行。

3.依赖倒置原则

面向接口编程。

4.接口隔离原则

接口细化,也就是接口中的方法要尽量少。

5.迪米特法则

也称为最少知识原则,其定义为:一个对象应当对其它对象有最少的了解。也就是一个类中不要有过多的其它类。

6.开闭原则

开闭原则的核心是:对扩展开放。对改动关闭。

3.圈复杂度(Cyclomatic Complexity,CC)

圈复杂度(下面简称CC)是一种度量方法,表明一个方法中运行路径的数量。

CC从1開始,每多一个条件语句(if。else。switch…case。while,for)CC值加1;

一个方法的CC值越大,表明该方法越复杂;

CC值指明了全然測试一个方法所须要的測试用例。

4.圈复杂度度量

CC∈[0,5]:代码质量不错;

CC∈[6,20]:可能存在须要拆分的代码,应该尽可能想办法重构。

CC∈[21, ∞ ):必须进行重构。假设你的代码CC常常达到这个水平,请又一次整理Coding的思路;

请尽可能保证CC<10。

5.圈复杂度计算

V(G) = e – n + 2;

V(G):圈复杂度

e:程序流程图中的边数。

n:程序流程图中的节点数;

6.圈复杂度计算

代码:

void test() {

     int cnt = 0;

     for(int I = 0;I < 100;i++) {
         cnt++;
     }

     if(cnt > 100) {
          System.out.println();
     }
     …
}

对应流程图:

7.减少圈复杂度

方法一

提炼函数,抽取方法:

优化前:

Int  getAppKey(String user, String package) {
    String userId = “”;
    String packageId = “”;

    System.out.println(“=============”);

    if(null == user) {
        System.out.println(“user id is null.”);
    } else {
        userId = “user_” + id1;
        System.out.println(“userid is ” + userId );
    }

 if(null == package) {
        System.out.println(“packageId id is null.”);
    } else {
        packageId = “package_” + id2;
        System.out.println(“packageId is ” + packageId );
    }

    System.out.println(“=============”);
    return userId .hashCode()  ^ packageId .hashCode();
}

优化后:

Int  getAppKey(String user, String package) {
    String userId = geId(“user_”, user);
    String packageId = getId(“package_”, package);
    printId(userId,  packageId );
    return userId .hashCode()  ^ packageId .hashCode();
}

String getId(String head, String key) {
    String id = “”;
    if(key != null) {
        id=  head + user;
    }
     return id;
}

String getPrintInfo(String name, String value) {
    String info = name + “is ” + value;
    if(“”.equals(value)) {
        info = name + “is null.”;
    }
     return id;
}

void printId(String  userId , String packageId)  {

    System.out.println(“=============”);
    System.out.println(getPrintInfo(“userId”, userId));
    System.out.println(getPrintInfo(“packageId”, packageId));
    System.out.println(“=============”);
}

方法二

用循环替代条件式:

优化前:

String getName(String id) {
        String name = null;
        if("0000".equals(id)) {
            name = "小吴";
        }
        if("0001".equals(id)) {
            name = "小王";
        }
        if("0002".equals(id)) {
            name = "老赵";
        }
        if("0003".equals(id)) {
            name = "小李";
        }
        if("0004".equals(id)) {
            name = "小刘";
        }
        if("0005".equals(id)) {
            name = "小张";
        }
        return name;
    }

优化后:

private static String getName(String id) {
        String name = null;
        //当元素个数较多的时候,将数组替换成Map。数组对象可作为參数传入。

String[] idArray = new String[]{"0000", "0001", "0002", "0003", "0004", "0005"};
        String[] nameArray = new String[]{"小吴", "小王", "老赵", "小李", "小刘", "小张"};
        for(int i = 0;i < idArray.length;i++) {
            Object peopleID = idArray[i];
            if(peopleID.equals(id)) {
                name = nameArray[i];
                 break;
            }
        }
        return name;
    }

方法三

用初始值消减条件分支:

优化前:

String getCode(String id) {
        String code = "";

        if(null == id) {
            code = "0000";
        } else {
            code = "00" + id;
        }
        return code;

    }

优化后:

String getCode(String id) {

        //初始化时设为默认值
        String code = "0000";

        if(id != null) {
            code = "00" + id;
        }
        return code;

    }

方法四

函数取代參数:

优化前:

String getValue(String param) {

        String value = null;

        if("name".equals(param)) {
            value = mName;
        } else if("hight".equals(param)) {
            value = mHight;
        } else if("X".equals(param)) {
            value = mX;
        } else if("Y".equals(param)) {
            value = mY;
        }

        return value;
    }

优化后:

 String getName() {
        return mName;
    }

    private static String getHight() {
        return mHight;
    }

    private static String getX() {
        return mX;
    }

    private static String getY() {
        return mY;
    }

方法五

用參数应对变化:

优化前:

private static int getWidth(int val) {

        int width = 0;

        if(val == 10) {
            width += ((val << 2) ^ 0x10) * 200;
        } else if(val == 100) {
            width += ((val << 2) ^ 0x1a) * 200;
        }

        return width;
    }

优化后:

private static int getWidth(int val) {

        int width = 10;

        width += getDeta(val, 0x10);
        width += getDeta(val, 0x1a);

        return width;
    }

    private static int getDeta(int val, int trim) {
        int deta = 0;
        if(val == range) {
            deta = ((val << 2) ^ trim) * 200;
        }
        return deta;
    }
时间: 2024-10-18 19:04:23

ym——优化你的Java代码(新)的相关文章

Linkedin工程师是如何优化他们的Java代码的

原文链接:Linkedin工程师是如何优化他们的Java代码的 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念"super")的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的优化经验. 1. 谨慎对待Java的循

Linkedin工程师是如何优化他们的Java代码的(转)

英文原文:LinkedIn Feed: Faster with Less JVM Garbage 最近在刷各大公司的技术博客的时候,我在Linkedin的技术博客上面发现了一篇很不错博文.这篇博文介绍了Linkedin信息流中间层Feed Mixer,它为Linkedin的Web主页,大学主页,公司主页以及客户端等多个分发渠道提供支撑(如下图所示). 在Feed Mixer里面用到了一个叫做SPR(念“super”)的库.博文讲的就是如何优化SPR的java代码.下面就是他们总结的优化经验. 1

优化你的Java代码

1.面向对象的3要素. 2.面向对象开发的6大原则. 1.单一职责原则 应该有且仅有一个原因引起类的变更. 2.里氏替换原则 只要父类能出现的地方,其子类就应该能出现.也就是用子类替换父类后,保证程序照样运行. 3.依赖倒置原则 面向接口编程. 4.接口隔离原则 接口细化,也就是接口中的方法要尽量少. 5.迪米特法则 也称为最少知识原则,其定义为:一个对象应当对其他对象有最少的了解.也就是一个类中不要有过多的其他类. 6.开闭原则 开闭原则的核心是:对扩展开放,对修改关闭. 3.圈复杂度(Cyc

优化你的java代码性能

一.避免在循环条件中使用复杂表达式 在不做编译优化的情况下,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 例子:import java.util.Vector;class CEL {    void method (Vector vector) {        for (int i = 0; i < vector.size (); i++)  // Violation            ; // ...    }} 更正:class C

Java 代码性能优化总结

35 个 Java 代码性能优化总结 前言 代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的鲸鱼一样,它吃一条小虾米有用吗?没用,但是,吃的小虾米一多之后,鲸鱼就被喂饱了.代码优化也是一样,如果项目着眼于尽快无BUG上线,那么此时可以抓大放小,代码的细节可以不精打细磨:但是如果有足够的时间开发.维护代码,这时候就必须考虑每个可以优化的细节了,一个一个细小的优化点累积起来,对于代码的运行效率

Java代码性能优化技巧

流方面: private FileOutputStream writer; writer = new FileOoutputStream(fileName); 使用BufferedOutputStream 对写入FileOutputStream的数据进行缓存 //将writer的类型由FileOutputStream 变更为BufferedOutputStream //private FileOutputStream writer; private BufferedOutputStream wr

替换文件中某个字符串并写入新内容(Java代码实现)

import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.FileWriter; import java.io.InputStream; import java.io.InputStreamReader; /* * 替换文件(如果该文件含有子目录,则包括子目录所有文件)中某个字符串并写入新内容(J

优化 Java 代码

本文来自:CSDN阿里资深工程师教你如何优化java代码 方便记忆,做了代码 格式化处理.作色高亮. 正文: 一.让代码性能更高 1.需要 Map 的主键和取值时,应该迭代 entrySet 当循环中只需要 Map 的主键时,迭代 keySet 是正确的.但是,当需要主键和取值时,迭代 entrySet 才是更高效的做法,比先迭代 keySet 后再去 get 取值性能更佳. 反例: Map<String, String> map = ...; for (String key : map.ke

如何使用JVisualVM远程监控和优化Tomcat和Java程序的内存和CPU

如何使用VisualVM远程监控和优化Tomcat和Java程序的内存和CPU JVisualVM 是Java 继 JConsole 之后有一款力作,是集成了诸多分析和优化Java程序的工具的工具. 我们可以用它来为优化Java程序的内存占用,找出内存泄漏,分析Java程序的CPU占用情况,根据JVisualVM获取到的数据优化JVM配置等.   总之是相当好了~~~~ JVisualVM 位于JAVA_HOME/bin目录下 . 直接运行可打开. 打开后界面如下: 由于JVisualVM 本身