Set<Character> letters = new HashSet<>();
letters.add('a');
letters.add('b');
// ... 繁瑣重複
Set<Character> letters = new HashSet<Character>() {{
add('a'); add('b'); add('c'); add('d');
add('e'); add('f'); add('g'); add('h');
// ... 一次性填充
}};
{ }:定義一個 **匿名內部類**,繼承 HashSet。{ }:**實例初始化塊**,在構造器執行前運行,此處 this 指向該匿名類實例,可直接調用 add()。等價展開:
Set<Character> letters = new HashSet<Character>() {
{
add('a');
add('b');
}
};
| 優點 | 缺點 |
|---|---|
| 代碼緊湊、聲明式風格 | 產生**匿名類 Class 文件**(如 Main$1.class),增加元空間開銷 |
| 適用於測試、原型、小規模靜態數據 | 持有外部類引用,可能阻礙 GC(若外部類大對象) |
不支援鑽石操作符 <> 型推導(需顯式寫泛型) | |
序列化風險:匿名類隱含 serialVersionUID 不穩定 |
// List.of / Set.of / Map.of 不可變集合工廠
Set<Character> letters = Set.of('a','b','c','d','e','f','g','h');
// 可變集合
List<String> list = new ArrayList<>(List.of("a","b","c"));
**建議**:生產代碼優先用 List.of/Set.of 或 Stream 建構器;雙大括號僅限快速原型。