在一个好的项目中代码优化是永远离不开的话题,如果有充足的时间开发和维护代码,必须考虑每个可以优化的细节,日积月累,项目的质量才会上升,代码优化是绝对有必要的工作。代码优化的主要目的是减少代码块,提升代码运行效率。
1.采用懒加载策略,在需要时Create,代码如下:
String yd = “www.yoodb.com”; List<String> list = new ArrayList<>(); if(true){ list.add(yd); } 替换为 if(true){ String yd = “www.yoodb.com”; List<String> list = new ArrayList<>(); list.add(yd); }
2.使用数据库连接池和线程池
两者都是重用对象的,连接池可以避免频繁打开或关闭连接,线程池可以避免频繁创建或销毁线程。
3.使用位移替换乘除法
for(int i=1;i<100;i++){ int a = i * 8; int b = i / 2; Sysout.out.println(a + “-----” + b); } 替换为 for(int i=1;i<100;i++){ int a = i << 3; int b = i >> 1; Sysout.out.println(a + “-----” + b); }
位移操作方便快捷,可以极大的提高性能
4.循环内避免不断的创建对象
for(int i=1;i<100;i++){ Object ob = new Object(); } 替换为 Object ob = null; for(int i=1;i<100;i++){ ob = new Object(); }
替换之后内存中只有一个Object对象引用,从而执行不同的Object对象,其实内存中只有一个,节省了内存消耗。
5.慎用异常
1)抛出异常首先创建一个新的对象,Throwable接口调用fillInStackTrace()的本地同步方法,检查堆栈收集调用跟踪信息。只要异常被抛出,Java虚拟机就会调用堆栈,异常适用于处理错误,不适用于控制程序流程。
2)避免在循环中使用try{….}catch(Exception e){}处理异常,尽量在循环外处理
6.I/O流
Java对数据库进行连接或读取文件时,操作I/O流在使用完之后一定要及时关闭以释放资源
7.减少对变量的重复计算
for(int i=1;i< list.size();i++){ … } 替换为 for(int i=1,length = list.size();i<length;i++){ … }
8.static final常量声明,并以大写命名
编译时放入常量池中,从而避免在运行程序时再计算生成常量的值,以大写命名方便区分常量与变量,习惯写法。
9.避免创建不使用的对象或导入的类
在导入类时有个黄色小灯泡显示“The value of the local variable i is not used”,此时的类是没有用的建议删除掉,删除所有引入但是没有使用的类快捷键 Shift+Ctril+O
10.参数判断,”if (ia== 1){…}”和”if (1== a){…}”是没有区别的,个人习惯建议使用if(a==1){…}
11. 使用带缓冲的输入输出流进行IO操作
带缓冲的I/O流为BufferedReader、BufferedWriter、BufferedInputStream、BufferedOutputStream,可以极大地提升IO效率
12. 单例模式优缺点以及在合理的场合使用单例模式
【优点】
1)实例控制
单例模式会阻止其他对象实例化其自己的单例对象的副本,从而确保所有对象都访问唯一实例。
2)灵活性
因为类控制了实例化过程,所以类可以灵活更改实例化过程。
【缺点】
1)开销
虽然数量很少,但如果每次对象请求引用时都要检查是否存在类的实例,将仍然需要一些开销。可以通过使用静态初始化解决此问题。
2)可能的开发混淆
使用单例对象(尤其在类库中定义的对象)时,开发人员必须记住自己不能使用new关键字实例化对象。因为可能无法访问库源代码,因此应用程序开发人员可能会意外发现自己无法直接实例化此类。
3)对象生存期
不能解决删除单个对象的问题。在提供内存管理的语言中(例如基于.NET Framework的语言),只有单例类能够导致实例被取消分配,因为它包含对该实例的私有引用。在某些语言中(如 C++),其他类可以删除对象实例,但这样会导致单例类中出现悬浮引用。
使用场合情况:
1)限制创建示例(读取配置文件),节约资源
2)限制资源使用情况,通过线程同步来控制资源的并发访问
3)限制共享数据,在未建立直接关联的条件下让多个不相关的进程或线程之间实现通信