第51条 当心字符串连接的性能
public class Test {
public static void main(String[] args) {
//String
String a = "";
long startTime=System.currentTimeMillis();
for (int i = 0;i<100000;i++){
a= a+i;
}
long endTime=System.currentTimeMillis();
float excTime=(float)(endTime-startTime)/1000;
System.out.println("String执行时间:"+excTime+"s");
//StringBuilder
StringBuilder b = new StringBuilder("");
long startTime1=System.currentTimeMillis();
for (int i = 0;i<100000;i++){
b.append(i);
}
long endTime1=System.currentTimeMillis();
float excTime1=(float)(endTime1-startTime1)/1000;
System.out.println("StringBuilder执行时间:"+excTime1+"s");
//StringBuffer
StringBuffer c = new StringBuffer("");
long startTime2=System.currentTimeMillis();
for (int i = 0;i<100000;i++){
c.append(i);
}
long endTime2=System.currentTimeMillis();
float excTime2=(float)(endTime2-startTime2)/1000;
System.out.println("StringBuffer执行时间:"+excTime2+"s");
}
}
第52条 通过接口引用对象
适合于用类来引用对象的情形:
1.如果没有合适的接口存在,可以用类来引用对象。
例如,考虑值类(String、BigInteger)很少用多个实现编写,他们通常是final的,并且很少有对应的接口。使用这种值类作为参数、变量、域或者返回值类型就比较合适。
2.对象属于一个框架,而框架的基本类型是类,不是接口。(对象属于基于类的框架)
例如java.util.TimerTask抽象类。应该用相关的基类(往往是抽象类)来引用对象,而不是它的实现类。
3.类实现了接口,但是它提供了接口中不存在的额外方法。
例如LinkedHashMap,程序依赖于这些额外的方法,这种类就应该只被用来引用它的实例。
总结:给定的对象是否具有适当的接口应该是很明显的。如果是,用接口引用对象就会使程序更加灵活;如果不是,则使用类层次结构中提供了必要功能的最基础的类。
第53条 接口优先于反射机制
JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。
反射机制是一种功能强大的机制,对于特定的复杂系统编程任务,它是非常必要的,但它也有一些缺点。如果你编写的程序必须要与编译时未知的类一起工作,如有可能,就应该仅仅使用反射机制来实例化对象,而访问对象时则使用编译时已知的某个接口或者超类。
第54条 谨慎地使用本地方法
本地方法是指用本地程序设计语言(比如C或者C++)来编写的特殊方法。本地方法在本地语言中可以执行任意的计算任务,并返回到Java程序设计语言。
在使用本地方法之前务必三思。极少数情况下会需要使用本地方法来提高性能。如果你必须要使用本地方法来访问底层的资源,或者遗留代码库,也要尽可能少用本地代码,并且要全面进行测试。本地代码中的一个Bug就有可能破坏整个应用程序。
第55条 谨慎地进行优化