Java EnumSet:作成、操作、パフォーマンスのヒント
Java EnumSet
このガイドでは、実践的なコード例とベストプラクティスの洞察で、JavaEnumSetコレクションの作成、操作、最適化を歩いていきます。
EnumSetクラスは、enum型専用に設計された高性能セット実装です。java.util.Setインターフェースを実装し、CloneableとSerializableも継承するため、汎用性と効率性を兼ね備えています。
EnumSetに入る前に、Java enumに慣れておくことをお勧めします。セットは単一のenum型に密接に結合されているためです。

EnumSetの作成
他のセット実装とは異なり、EnumSetはpublicコンストラクタを公開しません。代わりに、静的ファクトリメソッドを使用してセットを構築します。
1. EnumSet.allOf()の使用
allOf()メソッドは、指定されたenum型のすべての定数を含むセットを作成します。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
}
}
出力
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE]
2. EnumSet.noneOf()の使用
指定されたenum型の値のみを含む空のセットを作成します。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.noneOf(Size.class);
System.out.println("空のEnumSet: " + sizes);
}
}
出力
空のEnumSet: []
Size.classでインスタンス化されたため、Size定数のみを受け入れます。3. EnumSet.range()の使用
下限から上限まで(両端含む)のすべてのenum定数を含むセットを構築します。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.range(Size.MEDIUM, Size.EXTRALARGE);
System.out.println("EnumSet: " + sizes);
}
}
出力
EnumSet: [MEDIUM, LARGE, EXTRALARGE]
4. EnumSet.of()の使用
1つ以上の特定のenum定数を含むセットを作成します。
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes1 = EnumSet.of(Size.MEDIUM);
System.out.println("EnumSet1: " + sizes1);
EnumSet<Size> sizes2 = EnumSet.of(Size.SMALL, Size.LARGE);
System.out.println("EnumSet2: " + sizes2);
}
}
出力
EnumSet1: [MEDIUM] EnumSet2: [SMALL, LARGE]
EnumSetの一般的操作
要素の追加
add()- 単一のenum定数を挿入addAll()- 同じenum型の別コレクションをマージ
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> all = EnumSet.allOf(Size.class);
EnumSet<Size> selected = EnumSet.noneOf(Size.class);
selected.add(Size.MEDIUM);
System.out.println("add()後: " + selected);
selected.addAll(all);
System.out.println("addAll()後: " + selected);
}
}
出力
add()後: [MEDIUM] addAll()後: [SMALL, MEDIUM, LARGE, EXTRALARGE]
addAll()は同じenum型を含む限り、リストやセットなど任意のCollection<Size>を受け入れます。
要素のイテレーション
Iteratorでセットを走査します:
import java.util.EnumSet;
import java.util.Iterator;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
Iterator<Size> it = sizes.iterator();
System.out.print("EnumSet: ");
while (it.hasNext()) {
System.out.print(it.next() + ", ");
}
}
}
出力
EnumSet: SMALL, MEDIUM, LARGE, EXTRALARGE,
要素の削除
remove()- 特定定数を削除removeAll()- 自身を渡すとセットをクリア
import java.util.EnumSet;
class Main {
enum Size { SMALL, MEDIUM, LARGE, EXTRALARGE }
public static void main(String[] args) {
EnumSet<Size> sizes = EnumSet.allOf(Size.class);
System.out.println("EnumSet: " + sizes);
boolean removed = sizes.remove(Size.MEDIUM);
System.out.println("MEDIUMは削除されたか? " + removed);
boolean cleared = sizes.removeAll(sizes);
System.out.println("すべての要素が削除されたか? " + cleared);
}
}
出力
EnumSet: [SMALL, MEDIUM, LARGE, EXTRALARGE] MEDIUMは削除されたか? true すべての要素が削除されたか? true
追加のヘルパーメソッド
| メソッド | 説明 |
|---|---|
copyOf() | 同じ要素を含む新しいEnumSetを作成 |
contains() | 特定定数の存在確認 |
isEmpty() | 要素がなければtrue |
size() | 要素数を返す |
clear() | すべての要素を削除 |
CloneableとSerializable
EnumSetはCloneableを実装し、clone()でシャローコピー作成を可能にします。またSerializableも実装し、ネットワーク経由の安全な送信やディスクへの持続化を可能にします。
なぜEnumSetを使うのか?
EnumSetは値をビットベクトルとして格納するため、add、remove、containsなどの操作が最小メモリオーバーヘッドで定数時間実行されます。JVMは特定のenumの可能な定数セットを正確に把握しているため、EnumSetはHashSetやTreeSetのような汎用実装よりはるかに効率的です。
実践では、enum値の高性能セットが必要な場合はいつでもEnumSetを選択してください。
Java
- Java演算子をマスター:種類、構文、実践例
- Javaコメント:種類、使い方、ベストプラクティス
- Java拡張forループをマスター:構文、例、ベストプラクティス
- Java文字列をマスター:生成、メソッド、ベストプラクティス
- Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
- Java無名インナークラス完全ガイド:定義、構文、実践例
- Java Enum完全ガイド:列挙型とEnumクラスの活用法
- Java Enumコンストラクタ徹底解説:実践例で理解する
- Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
- Javaアノテーション完全ガイド:種類、配置場所、実践例
- Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上