其实我们有点java基础的同学都应该清楚能少创建对象就少创建对象,甚至在Effective Java中的多次强调让我们能不创建对象就不创建对象,可是我们在实际代码中真正做到这一点的有几个呢?
首先我们先来看下面一段代码吧:
public static void main(String[] args) {
long startTime = System.currentTimeMillis();
Long sum = 0L;
for(long i = 0 ; i < Integer.MAX_VALUE ; i++) {
sum += i;
}
System.out.println(System.currentTimeMillis() - startTime);
}
这段代码在我机器里打出了:44797,也就是说40几秒
可是如果我们修改一下:
把Long sum = 0L;改成 long sum = 0;
在我机器里打出了:9016,也就是说10秒都不到
可见创建对象与不创建对象的效率差距是多大了,其实这还好了,要是多次创建如数据库的Connection等一些更耗时的对象,那么更糟糕了。
好了,我们有什么方法可以避免创建不必要的对象呢?
第一,用静态工厂方法代替构造器
好处:1,实例出的对象有名称;
2,不必每次调用的时候都创建一个新的对象
3,可以返回原返回类型的任何子类型的对象
4,在创建参数化类型实例的时候,它们使代码变得更加简洁
第二, 优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱
好处:速度快,上面的例子正好说明了这一点
第三,有效地重复利用一个已经初始化的对象
Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
gmtCal.set(1946,Calendar.JANUARY,1,0,0,0);
BOOM_START = gmtCal.getTime();
gmtCal.set(1965,Calendar.JANUARY,1,0,0,0);
BOOM_END = gmtCal.getTime();
两次需要用来时间,但是只初始化了一个Calendar对象,可见是相当省时.
总结:本节提出的是不要创建不必要的对象,并不是指创建对象的代价非常昂贵,我们应该要尽可能地避免创建对象。相反,由于小对象的构造哭只做很少量的工作,所以,小对象的创建和回收动作是非常廉价的,特别是在现代的JVM实现上更是如此。通过创建附加的对象,提升程序的清晰性、简洁性和功能性,这通常是件好事。