1.避免使用new String("hello")创建不必要的字符串对象(在Java里,字符串实现为常量,以上方式将创建不必要的字符串对象)。以下测试:
private String temp;
@BeforeClass
public void init(){
//初始化创建hello字符串对象,避免影响后面测试
this.temp="hello";
}
@Test
public void testStringOne(){
for(int i=0;i<10000;i++){
String s="hello";
System.out.println(s);
}
}
@Test
public void testStringTwo(){
for(int i=0;i<10000;i++){
String s=new String("hello");
System.out.println(s);
}
}
测试结果如下:
注意:理论上testStringTwo ()因为创建了不必要的String对象,消耗的时间应更多。实际上 却相反,原因不知
2.避免使用自动封装。以下测试里,第一个测试方法变量sum为Long类型,在计算时,会自动转换为long,计算完成后再转换为Long,影响性能。推荐优先使用基本数据类型
@Test
public void testLongOne(){
Long sum=0l;
for(long i=0;i<10000000;i++)
sum+=i;
System.out.println(sum);
}
@Test
public void testLongTwo(){
long sum=0l;
for(long i=0;i<10000000;i++)
sum+=i;
System.out.println(sum);
}
测试结果:
3.避免创建多个只读对象,可结合使用静态工厂方法返回只读对象
public static Boolean valueOf(boolean b) {
return b ? Boolean.TRUE : Boolean.FALSE;
}
此外,java.util.Map的keySet()方法总是返回同一个Set对象,修改此Set包含的key值将影响对应的Map对象,反之亦然。尽管如此,一般情况都不会修改返回的Set对象。使用此方式也可以避免创建额外的对象。
可以在静态代码块里初始化只读对象,也可以在第一次调用对象方法时初始化只读对象。但是后者需要考虑多线程访问的情况