博客
关于我
代码优化
阅读量:338 次
发布时间:2019-03-04

本文共 3082 字,大约阅读时间需要 10 分钟。

工作中碰到的有:for循环遍历网点信息、做if判断是否托盘绑定状态时的懒加载、做货量效率遇到的乘除法移位操作、对路由线路切割时尽量少用split,用StringUtils中的方法、使用equals方法作比较时注意顺序避免空指针异常。

1、遍历能用foreach,能尽量减少对变量的重复计算

例如:

for(int i = 0;i < list.size; i ++) {   …}

应替换为:

for(int i = 0,int len = list.size();i < len; i ++){   …}

2、在if判断中定义变量尽量采用lazy loading 的策略,即在需要的时候才开始创建。

例如:

String str = “aaa”;if(i == 1) {   	list.add(str);}应替换为:if(i == 1) {   	String str = “aaa”;	list.add(str);}

3、捕捉异常不要在循环中使用:

Try {   } catch() {   }

应把其放置在最外层

4、如果能估计到待添加的内容长度以数组方式为底层实现的集合、工具类,要通过构造方法来指定初始长度,否则白白多了默认的16个字符空间

比如ArrayList、LinkedLlist、HashMap、HashSet、StringBuilder、StringBuffer等等,以StringBuilder为例:
有三个构造方法 :

StringBuffer (); //默认分配16个字符的空间StringBuffer (int size); //分配size个字符的空间StringBuffer (String str); //分配16个字符+str.length()个字符空间

你可以通过StringBuffer的构造函数来设定它的初始化容量,这样可以明显地提升性能

了解、了解、了解:
你也可以使用ensureCapacity(int minimumcapacity)方法在StringBuffer对象创建之后设置它的容量
StringBuffer在内部维护一个字符数组,当你使用缺省的构造函数来创建StringBuffer对象的时候,因为没有设置初始化字符长度,StringBuffer的容量被初始化为16个字符,
也就是说缺省容量就是16个字符。当StringBuffer达到最大容量的时候,它会将自身容量增加到当前的2倍再加2,也就是(2旧值+2)。
如果你使用缺省值,初始化之后接着往里面追加字符,在你追加到第16个字符的时候它会将容量增加到34(2
16+2)。
无论何时只要StringBuffer到达它的最大容量它就不得不创建一个新的字符数组然后重新将旧字符和新字符都拷贝一遍――这也太昂贵了点吧。
所以总是给StringBuffer设置一个合理的初始化容量值是错不了的,这样会带来立竿见影的性能增益。

5、用移位操作替代乘法和除法

考虑下面的代码:

for (val = 0; val < 100000; val +=5) {   	alterX = val * 8; 	myResult = val * 2;}

用移位操作替代乘法操作可以极大地提高性能。下面是修改后的代码:

for (val = 0; val < 100000; val += 5) {   	alterX = val << 3; 	myResult = val << 1;}

6、array(数组) 和 ArryList的使用

array([]):最高效;但是其容量固定且无法动态改变;
ArrayList:容量可动态增长;但牺牲效率;
基于效率和类型检验,应尽可能使用array,无法确定数组大小时才使用ArrayList!

7、尽量避免使用split

除非是必须的,否则应该避免使用split,split由于支持正则表达式,所以效率比较低,如果是频繁的几十,几百万的调用将会耗费大量资源,如果确实需要频繁的调用split,可以考虑使用apache的 StringUtils.split(string,char),频繁split的可以缓存结果

8、循环内不要不断的创建对象引用

for (int i = 1; i <= count; i++){Object obj = new Object;}

9、 把公用的代码提取出来

10、类名,方法名和变量名尽量使用简短的名字,可以考虑使用Hashjava, Jobe, Obfuscate and Jshrink等工具自动完成这个工作

11、 异常在需要抛出的地方抛出,try catch能整合就整合

try {    	some.method1(); // Difficult for javac } catch( method1Exception e ) {    // and the JVM runtime 	// Handle exception 1 // to optimize this } // code try {    	some.method2(); } catch( method2Exception e ) {    	// Handle exception 2 }try {    	some.method3(); } catch( method3Exception e ) {    	// Handle exception 3 }

以下代码更容易被编译器优化 :

try {    	some.method1(); // Easier to optimize 	some.method2(); 	some.method3(); } catch( method1Exception e ) {    	// Handle exception 1 } catch( method2Exception e ) {    	// Handle exception 2 } catch( method3Exception e ) {    	// Handle exception 3 }

12、注意equals两边内容顺序,可以避免空指针异常

String str = "123";if (str.equals("123"))

建议修改为:

String str = "123";if ("123".equals(str))

13、不要对数组使用toString()方法

14、把一个基本数据类型转为字符串,基本数据类型.toString()是最快的方式、String.valueOf(数据)次之、数据+""最慢

15、对资源的close()建议分开操作

try{       XXX.close();    YYY.close();}catch (Exception e)

建议修改为:

try{       XXX.close();}catch (Exception e)try{       YYY.close();}catch (Exception e)

16、 尽量使用局部变量;

17、 不要重复初始化变量
18、及时清除不再使用的对象,设为null
19、尽可能使用final,static等关键字
20、尽可能使用buffered对象
21、日期类型的对象会占用很大的空间,如果你要存储大量的日期对象,可以考虑把它存储为
long型,然后在使用的时候转换为Date类型

转载地址:http://efse.baihongyu.com/

你可能感兴趣的文章
如何使用google搜索?
查看>>
浅析接口和抽象类的区别与使用场景
查看>>
HashSet和HashMap的区别
查看>>
Redis分布式锁的正确实现方式
查看>>
Java中对象和JSON互相转换的工具类
查看>>
设计模式-抽象工厂模式
查看>>
MySQL Explain查看执行计划详解
查看>>
IntelliJ IDEA 中,项目文件右键菜单没有svn选项解决办法
查看>>