您的位置:首页 > 编程语言 > Java开发

java代码性能优化总结

2012-08-23 20:30 573 查看
(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类缓存了-128到127这256个状态的Integer,如果使用 Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。

(3). 用StringBuffer的append方法代替"+"进行字符串相加。

这个已经被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")));

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

int整数相乘溢出

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

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

解决办法:

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

long microsPerDay = 24L*60*60*1000*1000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: