[b](1). 用Boolean.valueOf(boolean b)代替new Boolean()[/b]
包装类的内存占用是很恐怖的,它是基本类型内存占用的N倍(N>2),同时new一个对象也是性能的消耗。
我们再看看JDK对于Boolean.valueOf(boolean b)的实现:
Boolean类提供了两个常量:
而valueOf(boolean b)的内部实现是:
因此用Boolean.valueOf(boolean b)代替new Boolean()既能节省空间,又能提高性能。
[b](2). 用Integer.valueOf(int i)代替new Integer()[/b]
和Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个状态的Integer,如果使用 Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。
[b](3). 用StringBuffer的append方法代替"+"进行字符串相加。[/b]
这个已经被N多人说过N次了,这个就不多说了。
[b](4). 避免过深的类层次结构和过深的方法调用。[/b]
因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。
[b](5). 变量只有在用到它的时候才定义和实例化。[/b]
这是初学者最容易犯的错,合理的使用变量,并且只有在用到它的时候才定义和实例化,能有效的避免内存空间和执行性能上的浪费,从而提高了代码的效率。
[b](6). 避免在循环体中声明创建对象,即使该对象占用内存空间不大。[/b]
这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码:
上面的做法会浪费较大的内存空间。正确的做法如下所示:
采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。
[b](7). 如果if判断中多个条件用'||'或者'&&'连接,请将出现频率最高的条件放在表达式最前面。[/b]
这个小技巧往往能有效的提高程序的性能,尤其是当if判断放在循环体里面时,效果更明显。
包装类的内存占用是很恐怖的,它是基本类型内存占用的N倍(N>2),同时new一个对象也是性能的消耗。
我们再看看JDK对于Boolean.valueOf(boolean b)的实现:
Boolean类提供了两个常量:
public static final Boolean TRUE = new Boolean(true);
public static final Boolean FALSE = new Boolean(false);
而valueOf(boolean b)的内部实现是:
return (b ? TRUE : FALSE);
因此用Boolean.valueOf(boolean b)代替new Boolean()既能节省空间,又能提高性能。
[b](2). 用Integer.valueOf(int i)代替new Integer()[/b]
和Boolean类似,java开发中使用Integer封装int的场合也非常多,并且通常用int表示的数值都非常小。SUN SDK中对Integer的实例化进行了优化,Integer类缓存了-128到127这256个状态的Integer,如果使用 Integer.valueOf(int i),传入的int范围正好在此内,就返回静态实例。这样如果我们使用Integer.valueOf代替new Integer的话也将大大降低内存的占用。
[b](3). 用StringBuffer的append方法代替"+"进行字符串相加。[/b]
这个已经被N多人说过N次了,这个就不多说了。
[b](4). 避免过深的类层次结构和过深的方法调用。[/b]
因为这两者都是非常占用内存的(特别是方法调用更是堆栈空间的消耗大户)。
[b](5). 变量只有在用到它的时候才定义和实例化。[/b]
这是初学者最容易犯的错,合理的使用变量,并且只有在用到它的时候才定义和实例化,能有效的避免内存空间和执行性能上的浪费,从而提高了代码的效率。
[b](6). 避免在循环体中声明创建对象,即使该对象占用内存空间不大。[/b]
这种情况在我们的实际应用中经常遇到,而且我们很容易犯类似的错误,例如下面的代码:
for (int i = 0; i < 10000; ++i) {
Object 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);
}
采用上面的第二种编写方式,仅在内存中保存一份对该对象的引用,而不像上面的第一种编写方式中代码会在内存中产生大量的对象引用,浪费大量的内存空间,而且增大了垃圾回收的负荷。因此在循环体中声明创建对象的编写方式应该尽量避免。
[b](7). 如果if判断中多个条件用'||'或者'&&'连接,请将出现频率最高的条件放在表达式最前面。[/b]
这个小技巧往往能有效的提高程序的性能,尤其是当if判断放在循环体里面时,效果更明显。