工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> Java

Java EnumSet:作成、操作、パフォーマンスのヒント

Java EnumSet

このガイドでは、実践的なコード例とベストプラクティスの洞察で、JavaEnumSetコレクションの作成、操作、最適化を歩いていきます。

EnumSetクラスは、enum型専用に設計された高性能セット実装です。java.util.Setインターフェースを実装し、CloneableとSerializableも継承するため、汎用性と効率性を兼ね備えています。

EnumSetに入る前に、Java enumに慣れておくことをお勧めします。セットは単一のenum型に密接に結合されているためです。

Java EnumSet:作成、操作、パフォーマンスのヒント


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の一般的操作

要素の追加

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,

要素の削除

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

  1. Java演算子をマスター:種類、構文、実践例
  2. Javaコメント:種類、使い方、ベストプラクティス
  3. Java拡張forループをマスター:構文、例、ベストプラクティス
  4. Java文字列をマスター:生成、メソッド、ベストプラクティス
  5. Javaインターフェース完全ガイド:概念、実装、ベストプラクティス
  6. Java無名インナークラス完全ガイド:定義、構文、実践例
  7. Java Enum完全ガイド:列挙型とEnumクラスの活用法
  8. Java Enumコンストラクタ徹底解説:実践例で理解する
  9. Javaのtry-with-resourcesをマスターする:自動リソース管理の仕組みと活用法
  10. Javaアノテーション完全ガイド:種類、配置場所、実践例
  11. Javaアサーション完全ガイド:バグ早期発見とコード信頼性の向上