5.避免創(chuàng)建不必要的對象

一般來說,如果能重用對象,盡量重用對象,而不是創(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)化的垃圾回收器,其性能很容易就超過輕量級的對象池的性能.

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容