類型拆解
List<Map<String, Object>>
- 最外層:List<...> — 有序集合,允許重複,支援索引存取。
- 元素類型:Map<String, Object> — 鍵值對集合,Key 為 String,Value 為任意物件。
- 實際執行時:因泛型擦除,JVM 僅看到
List 和 Map,型別參數僅在編譯期檢查。
具體資料結構圖解
List (介面)
└─ ArrayList (實作)
├─ [0] → Map (介面)
│ ├─ "img" → Integer (R.drawable.xxx)
│ ├─ "name" → String ("商品名")
│ ├─ "price" → Double (199.0)
│ └─ "tags" → List (巢狀集合)
├─ [1] → Map
│ ├─ "img" → Integer
│ └─ ...
└─ ...
常見操作範例
List<Map<String, Object>> data = getData();
// 遍歷
for (Map<String, Object> row : data) {
String name = (String) row.get("name"); // 需轉型
Object priceObj = row.get("price");
double price = priceObj instanceof Number ? ((Number)priceObj).doubleValue() : 0;
}
// 新增一筆
Map<String, Object> newRow = new HashMap<>();
newRow.put("id", 100);
newRow.put("title", "新商品");
data.add(newRow);
// 序列化為 JSON (Gson/Jackson 自動處理)
String json = new Gson().toJson(data);
避坑指南
- 型別安全:
Object 值取出需強制轉型,易發生 ClassCastException。建議定義 POJO/Record 替代 Map。
- 可變性:Map 內容可隨時修改,多執行緒環境下需同步或用
ConcurrentHashMap。
- 序列化:直接序列化 Map 可能產生冗長 JSON(含類別資訊),配置序列化庫忽略 null、使用蛇形命名。
現代替代方案 (Java 16+)
// Record 不可變資料載體,替代 Map
public record Item(int id, String name, double price, List tags) {}
List- items = new ArrayList<>();
items.add(new Item(1, "商品", 99.0, List.of("熱銷", "推薦")));
// 型別安全、自動 toString/equals/hashCode、可直接序列化