一般来说,如果能重用对象,尽量重用对象,而不是创建一个相同的对象.如果对象是不可变的,它始终就应该被重用.
作者举了非常多的反面例子
String对象的创建
String s = new String("string"); // 不要这么做
String s = "string" // 应该这么做
第一种方法会创建两个对象
而第二种只会创建一个对象,并且字符类型会保存在常量池里面,同样的String类型时会重用的
在静态工厂方法(第一条)中,使用缓存对象也是为了避买创建不必要的对象
常用方法调用的时候也会容易产生不必要的对象
下面的例子我做了一些简化,阅读更方便
// 反面例子,不要这么做 每次调用都要创建Calendar对象和Date对象
public class Person {
private final Date birthDate;
public boolean isBabyBoomer() {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Date date = calendar.getTime();
// 业务逻辑xxxxx
}
}
可以按照下面的方法来优化
public class Person {
private final Date birthDate;
private final Date date;
static {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date = calendar.getTime();
}
public boolean isBabyBoomer() {
// 在这里再使用date
}
}
你甚至还可以延迟初始化 date这个变量, 让第一次执行过才初始化它.
自动装箱
public static void main (String[] args){
Long sum = 0L;
for (long i = 0; i< Integer.MAX_VALUE;i++) {
sum += i;
}
System.out.println(sum);
}
由于自动装箱的特性, 使得每次循环都要执行一段 new Long(i,10);
本次循环中一共创建了2147483647个对象,这效率你懂的.
要优先使用基本类型而不是装箱基本类型,要当心无意识的自动装箱
最后一些话
不要错误的认为"创建对象的代价非常昂贵,我们应该要尽可能地避免创建对象".
相反,小对象的构造器只是做很少的工作,所以小对象的创建和回收是非常廉价的.
还有一点是通过维护对象池来避免创建对象并不是就是一种好的做法,除非是非常重量级的对象.
一般而言,维护自己的对象池必定会把代码弄得很乱,还会增加使用内存,损害性能.现代的JVM实现具有高度优化的垃圾回收器,其性能很容易就超过轻量级的对象池的性能.