java代码性能优化总结

(1). 用Boolean.valueOf(boolean b)代替new Boolean() 

包装类的内存占用是很恐怖的,它是基本类型内存占用的N倍(N>2),同时new一个对象也是性能的消耗。 
我们再看看JDK对于Boolean.valueOf(boolean b)的实现: 
Boolean类提供了两个常量: 

Java代码  

public static final Boolean TRUE = new Boolean(true);   

public static final Boolean FALSE = new Boolean(false);  

public static final Boolean TRUE = new Boolean(true);

public static final Boolean FALSE = new Boolean(false);


而valueOf(boolean b)的内部实现是: 

Java代码  

 return (b ? TRUE : FALSE);  

return (b ? TRUE : FALSE);


因此用Boolean.valueOf(boolean b)代替new Boolean()既能节省空间,又能提高性能。

(2). Integer.valueOf(int i)代替new Integer() 

Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128127256个状态的Integer,如果使用 Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。 

(3). StringBufferappend方法代替"+"进行字符串相加。 

这个已经被N多人说过N次了,这个就不多说了。 

(4). 避免过深的类层次结构和过深的方法调用。 

因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。 

(5). 变量只有在用到它的时候才定义和实例化。 

这是初学者最容易犯的错,合理的使用变量,并且只有在用到它的时候才定义和实例化,能有效的避免内存空间和执行性能上的浪费,从而提高了代码的效率。

(6). 避免在循环体中声明创建对象,即使该对象占用内存空间不大。 
这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码: 

Java代码  

 for (int i = 0; i < 10000; ++i) {   

   Object obj = new Object();   

    System.out.println("obj= " + obj);   

 }  

for (int i = 0; i < 10000; ++i) {

    Object obj = new Object();

    System.out.println("obj= " + obj);

}


上面的做法会浪费较大的内存空间。正确的做法如下所示: 

Java代码  

Object obj = null;   

for (int i = 0; i < 10000; ++i) {   

    obj = new Object();   

    System.out.println("obj= "+ obj);   

}  

Object obj = null;

for (int i = 0; i < 10000; ++i) {

    obj = new Object();

    System.out.println("obj= "+ obj);

}


采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。

(7). 如果if判断中多个条件用'||'或者'&&'连接,请将出现频率最高的条件放在表达式最前面。 

这个小技巧往往能有效的提高程序的性能,尤其是当if判断放在循环体里面时,效果更明显。

奇偶判断:

不要使用i%2==1来判断是否是奇数,因为i为负数时不成立

请使用 i%2 !=0 来判断是否是奇数或者使用高效式  (i&1) !=0

小数精确计算

     System.out.println(2.00 - 1.10); //0.899999999999

    一般来说,问题在于并不是所有的小数都可以用二进制浮点数精确表示.

    二进制浮点对于货币计算是非常不合适的,因为它不可能将1.0表示成10的其他任何负次幂.

    解决办法:

1).使用货币的最小单位()表示:

     System.out.println(220-110);//90

    2).使用BigDecimal,但一定要用BigDecimal(String)构造器,而千万不要用BigDecimal(double)来构造.

System.out.println(new BigDecimal("2.0").subtract(new BigDecimal("1.10")));

如果要比较两个浮点数的大小:要使用BigDecimalcompareTo方法

 int整数相乘溢出

    long microsPerDay = 24*60*60*1000*1000  正确结果为:86400000000

    System.out.println(microsPerDay);//500654080

    解决办法:

使计算表达式中的第一个因子明确为long

      long microsPerDay = 24L*60*60*1000*1000


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值