• 十条改进代码性能小建议


    一,避免在循环条件中使用复杂的表达式

    在循环中,循环条件会被反复计算,如果不使用复杂表达式而使循环条件值不变的化,程序会运行的更快

    import java.util.List;
    
    public class foreach {
        void method(List list){
            for (int i = 0; i < list.size(); i++) {
                System.out.println(list.get(i));  
            }
        }
    }

    应该改为

    import java.util.List;
    
    public class foreach {
        void methodImprovement(List list){
            int size = list.size();
            for (int i = 0; i < size; i++) {
                System.out.println(list.get(i));
            }
        }
    }

    二,应该在finally块中关闭stream

    程序中使用的资源应当被释放以免造成内存泄漏,这最好放在finally块中做,不管程序运行结果怎么样,finally块一定会执行的

    import java.io.FileInputStream;
    
    public class IOStream {
        void method() {
            try {
                FileInputStream fis = new FileInputStream("xxxxxx");
                int count = 0;
                while (fis.read() != -1) {
                    count++;
                }
                System.out.println(count);
                fis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    应当改为

    import java.io.FileInputStream;
    import java.io.IOException;
    
    public class IOStream {
        void methodImprovement() {
            FileInputStream fis = null;
            try {
                fis = new FileInputStream("xxxxxx");
                int count = 0;
                while (fis.read() != -1) {
                    count++;
                }
                System.out.println(count);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (fis != null) {
                    try {
                        fis.close();
                    } catch (IOException io) {
                      //处理异常
                    }
                }
            }
        }
    }

    三,避免不需要的instanceof操作

    如果A类继承/实现了B类/接口,那么instanceof表达式返回永远为ture

    public class Instanceof {
        public Instanceof() {
        }
    }
    
    
    class SubInstanceof extends Instanceof {
        void method() {
            SubInstanceof sub = new SubInstanceof();
            if (sub instanceof Instanceof) {
                System.out.println(true);  // 永远都是true
            }
            Instanceof ins = new Instanceof();
            if (ins instanceof Object) {
                System.out.println(true);  //永远都是true
            }
            
        }
    }

    改进

    public class Instanceof {
        public Instanceof() {
        }
    }
    
    
    class SubInstanceof extends Instanceof {
        void method() {
            SubInstanceof sub = new SubInstanceof();
            System.out.println("SubInstanceof永远是Instanceof");
            System.out.println("Instanceof永远是Object");
        }
    }

    四,避免没必要的转换类型操作

    像上面一样 任何类的实例都能用Object类型存在,同样,所有的子类也都隐含的等于其父类,由子类转向父类的操作就是不必要的了。

    五,如果只是查找单个字符,用charat()代替startwith()

    用一个字符作为参数调用startwith()也可以,但从性能上来说,使用charat()肯定更好。

    public class Demo {
        public static void main(String[] args) {
            String username="tom"; //避免魔法值
            //startWith()
            if(username.startsWith("t")){
                //方法体
            }
            //charAt()
            if(username.charAt(0)=='t'){
                //方法体
            }
        }
    }

    六,字符串相加的时候,如果该字符只有一个字符 用单引号代替双引号

    public class Strings {
        void method() {
            String a = "hell";
            System.out.println(a + "o");
        }
    }

    改进

    public class Strings {
        void method() {
            String a = "hell";
            System.out.println(a + 'o');
        }
    }

    七,尽量将try/catch移除循环

    try/catch在循环体内,会极大的影响性能

    import java.io.FileInputStream;
    
    public class IOStream2 {
        void method(FileInputStream fis) {
            for (int i = 0; i < 10; i++) {
                try {
                    int read = fis.read();
                } catch (Exception e) {
                }
            }
        }
    }

    改进

    import java.io.FileInputStream;
    
    public class IOStream2 {
        void method(FileInputStream fis) {
            try {
                for (int i = 0; i < 10; i++) {
                    int read = fis.read();
                }
            } catch (Exception e) {
            }
        }
    }

    八,对于不需要改变的字符串 用String代替StringBuff

    九,尽量使用三元运算符代替if()return;else return;

    public class TertiaryOperator {
        String method(int a) {
            if (a == 0) {
                return "true";
            } else {
                return "false";
            }
        }
    
        void method2(int a) {
            String s;
            if (a == 0) {
                s = "true";
            } else {
                s = "false";
            }
        }
    }

    改进

    public class TertiaryOperator {
        String method(int a) {
            return a == 0 ? "true" : "false";
        }
    
        void method2(int a) {
            String s;
            s = a == 0 ? "true" : "false";
        }
    }

    十,不要在循环体中实例化变量

    在循环里中实例化临时变量会增加内存消耗,正确的做法是在循环外实例化并反复使用

    import java.util.List;

    class Test {
    void method(List<String> names) {
    int size = names.size();
    for (int i = 0; i < size; i++) {
    Object obj = new Object();
    obj=names.get(i);
    }
    }
    }

    改进

    
    
    import java.util.List;

    class Test {
    void method(List<String> names) {
    int size = names.size();
    Object obj = new Object();
    for (int i = 0; i < size; i++) {
    obj=names.get(i);
    }
    }
    }
    不和别人一样,不复制只真正理解
  • 相关阅读:
    算法导论第十八章 B树
    腾讯2016春招之算法编程解析
    LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
    搜狗2016校园招聘之算法编程解析
    linux sed在某些字符串的下一行插入内容?sed在下一行插入?
    linux shell搜索某个字符串,然后在后面加上字符串?字符串后面插入字符串?sed字符串后面插入字符串?
    linux环境中,如何使用tar来创建压缩包?解压缩?
    linux环境中,ssh登录报错,Permission denied, please try again.
    linux环境中安装NRPE插件执行远程"本地资源"检查?NRPE安装?
    linux环境安装nagiosgraph将nagios的性能数据绘制成动态图表?
  • 原文地址:https://www.cnblogs.com/Vinlen/p/13161568.html
Copyright © 2020-2023  润新知