首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Effective Java 實戰:避免重複創建對象的優化模式

     編輯:Java 綜合教學

Effective Java 實戰:避免重複創建對象的優化模式

在實際開發中,重用對象遠優於頻繁創建。本文結合《Effective Java》經典案例,闡述兩類對象重用的最佳實踐。

案例一:字符串字面量 vs new String()

反模式:

String s = new String("haha"); // 每次執行創建新實例

若在循環或高頻調用方法中,將產生大量無用 String 實例,增加 GC 壓力。

優化模式:

String s = "haha"; // 單一實例,JVM 常量池自動重用

同一虛擬機中,相同字面量自動指向常量池同一實例。

案例二:可變對象的靜態化重用

低效寫法:isBabyBoomer() 每次調用創建 Calendar、TimeZone、Date 多個對象:

public boolean isBabyBoomer() {
    Calendar gmtCal = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
    gmtCal.set(1946, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomStart = gmtCal.getTime();
    gmtCal.set(1965, Calendar.JANUARY, 1, 0, 0, 0);
    Date boomEnd = gmtCal.getTime();
    return birthDate.compareTo(boomStart) >= 0 && birthDate.compareTo(boomEnd) < 0;
}

優化版:靜態初始化塊預創建不可變常量,方法調用零分配:

public class Person {
    private final Date birthDate;
    private static final Date BOOM_START;
    private static final Date BOOM_END;

    static {
        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();
    }

    public boolean isBabyBoomer() {
        return birthDate.compareTo(BOOM_START) >= 0 && birthDate.compareTo(BOOM_END) < 0;
    }
}

效果:類加載階段一次性創建輔助對象,後續調用無任何對象分配開銷。

核心原則

  1. 優先使用不可變對象(String、基本類型包裝類等),天然可重用
  2. 已知不會修改的可變對象,通過靜態工廠/單例/緩存機制重用
  3. 避免在熱點路徑(循環、高頻方法)中重複構建昂貴對象

摘自《Effective Java》條目 6:避免創建不必要的對象

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved