一般來說,如果能重用對象,盡量重用對象,而不是創(chuàng)建一個相同的對象.如果對象是不可變的,它始終就應該被重用.
作者舉了非常多的反面例子
String對象的創(chuàng)建
String s = new String("string"); // 不要這么做
String s = "string" // 應該這么做
第一種方法會創(chuàng)建兩個對象
而第二種只會創(chuàng)建一個對象,并且字符類型會保存在常量池里面,同樣的String類型時會重用的
在靜態(tài)工廠方法(第一條)中,使用緩存對象也是為了避買創(chuàng)建不必要的對象
常用方法調(diào)用的時候也會容易產(chǎn)生不必要的對象
下面的例子我做了一些簡化,閱讀更方便
// 反面例子,不要這么做 每次調(diào)用都要創(chuàng)建Calendar對象和Date對象
public class Person {
private final Date birthDate;
public boolean isBabyBoomer() {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
Date date = calendar.getTime();
// 業(yè)務邏輯xxxxx
}
}
可以按照下面的方法來優(yōu)化
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這個變量, 讓第一次執(zhí)行過才初始化它.
自動裝箱
public static void main (String[] args){
Long sum = 0L;
for (long i = 0; i< Integer.MAX_VALUE;i++) {
sum += i;
}
System.out.println(sum);
}
由于自動裝箱的特性, 使得每次循環(huán)都要執(zhí)行一段 new Long(i,10);
本次循環(huán)中一共創(chuàng)建了2147483647個對象,這效率你懂的.
要優(yōu)先使用基本類型而不是裝箱基本類型,要當心無意識的自動裝箱
最后一些話
不要錯誤的認為"創(chuàng)建對象的代價非常昂貴,我們應該要盡可能地避免創(chuàng)建對象".
相反,小對象的構造器只是做很少的工作,所以小對象的創(chuàng)建和回收是非常廉價的.
還有一點是通過維護對象池來避免創(chuàng)建對象并不是就是一種好的做法,除非是非常重量級的對象.
一般而言,維護自己的對象池必定會把代碼弄得很亂,還會增加使用內(nèi)存,損害性能.現(xiàn)代的JVM實現(xiàn)具有高度優(yōu)化的垃圾回收器,其性能很容易就超過輕量級的對象池的性能.