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

Java HashMap 存儲不同類型值的正確泛型聲明與使用

     編輯:程式設計綜合問答

問題場景

需在單個 Map 中存儲多種類型的值:boolean、Currency 對象、String 等,鍵均為 String。

解決方案:Map<String, Object>


Map<String, Object> map = new HashMap<>();
map.put("kProfileSetupDone", initialSetupDone); // boolean → 自動裝箱 Boolean
map.put("kDefaultCurrency", defaultCurrency);   // Currency 對象
map.put("kUserId", userId);                     // String

// 取值時需類型轉換
boolean setupDone = (Boolean) map.get("kProfileSetupDone");
Currency currency = (Currency) map.get("kDefaultCurrency");
String userId = (String) map.get("kUserId");

關鍵點

  1. 值類型聲明為 Object:Java 泛型不支持多態值類型,Object 是所有類的公共父類,可承載任意引用類型及裝箱後的基本類型。
  2. 自動裝箱/拆箱:put("key", true) 實際存入 Boolean.TRUE;取出時 (Boolean) map.get("key") 再拆箱為 boolean。
  3. 類型安全由開發者保證:編譯器無法檢查運行時類型,建議封裝 Getter 方法集中轉換與異常處理。

封裝最佳實踐


public class ProfileData {
    private final Map<String, Object> data = new HashMap<>();

    public void setSetupDone(boolean done) {
        data.put("kProfileSetupDone", done);
    }

    public boolean isSetupDone() {
        Object val = data.get("kProfileSetupDone");
        return val instanceof Boolean && (Boolean) val;
    }

    public void setDefaultCurrency(Currency currency) {
        data.put("kDefaultCurrency", currency);
    }

    public Currency getDefaultCurrency() {
        return (Currency) data.get("kDefaultCurrency");
    }
    // ... 其他類型安全 Getter/Setter
}

替代方案對比

方案優點缺點
Map<String, Object>簡單、靈活、標準 API需手動轉型、無編譯期類型安全
自定義類 (POJO)類型安全、IDE 支持、自文檔化結構固定、擴展需修改代碼
JSONObject / Bundle內建序列化、跨進程傳遞性能稍低、類型轉換同樣需手動

總結

臨時、動態、結構不固定的異構數據用 Map<String, Object>;固定業務模型優先定義 POJO 類,利用編譯器保障類型安全。兩者可共存:POJO 內部用 Map 存儲擴展屬性。

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