1. 概要

簡単に言うと、 Set は、重複する要素を含まないコレクションです。 Javaでは、SetCollectionインターフェースを拡張するインターフェースです。

このクイックチュートリアルでは、Javaでセットをコピーするさまざまな方法について説明します。

2. コピーコンストラクタ

Set をコピーする1つの方法は、Set実装のcopyコンストラクターを使用することです。

Set<T> copy = new HashSet<>(original);

コピーコンストラクターは、既存のオブジェクトをコピーすることによって新しいオブジェクトを作成するために使用される特殊なタイプのコンストラクターです。

ここでは、特定のセットの要素を実際に複製しているわけではありません。 オブジェクト参照を新しいセットにコピーしているだけです。 そのため、1つの要素で行われた各変更は、両方のセットに影響します。

3. Set.addAll

The 設定インターフェイスには全て追加する方法 。 コレクション内の要素をターゲットセットに追加します。 したがって、 addAll メソッドを使用して、既存のセットの要素を空のセットにコピーできます。

Set<T> copy = new HashSet<>();
copy.addAll(original);

4. Set.clone

SetCollectionインターフェースを拡張するインターフェースであるため、 Setインターフェースを実装するオブジェクトを参照して、Setの別のインスタンスを作成する必要があることに注意してください。 。HashSet TreeSet LinkedHashSet、 EnumSet はすべて、Set実装の例です。 X354X]。

これらすべてのSet実装には、 Cloneable インターフェイスを実装しているため、cloneメソッドがあります。

したがって、セットをコピーする別のアプローチとして、セットのcloneメソッドを呼び出すことができます。

Set<T> copy = (Set<T>) original.clone();

クローン作成は元々Object.cloneから行われることにも注意してください。セットの実装は、Objectクラスのcloneメソッドをオーバーライドします。 クローンの性質は、実際の実装によって異なります。 たとえば、 HashSet は浅いコピーしか実行しませんが、深いコピーを実行するようにコーディングすることはできます。

ご覧のとおり、クローン化されたオブジェクトを次のように型キャストする必要があります。 設定以来 cloneメソッドは実際にはオブジェクトを返します。

5. JSON

セットをコピーする別の方法は、セットを JSON文字列にシリアル化し、生成されたJSON文字列から新しいセットを作成することです。 このアプローチでは、セット内のすべての要素と参照される要素がシリアル化可能である必要があり、すべてのオブジェクトのディープコピーを実行することにも注意してください。

この例では、GoogleのGsonライブラリのserializationおよびdeserializationメソッドを使用してセットをコピーします。

Gson gson = new Gson();
String jsonStr = gson.toJson(original);
Set<T> copy = gson.fromJson(jsonStr, Set.class);

6. Apache Commons Lang

Apache Commons Lang には、特定のオブジェクトのクローンを作成するために使用できる特別なメソッド cloneを提供するクラスSerializationUtilsがあります。 このメソッドを使用して、セットをコピーできます。

for (T item : original) {
    copy.add(SerializationUtils.clone(item));
}

SerializationUtils.cloneは、そのパラメーターがSerializableクラスを拡張することを期待していることに注意してください。

7. Collectors.toSet

または、Java8のStreamAPICollectorsを使用して、セットのクローンを作成できます。

Set<T> copy = original.stream()
    .collect(Collectors.toSet());

Stream API の利点の1つは、スキップフィルターなどを使用できるようにすることで、より便利になることです。

8. Java10の使用

Java 10は、 Set インターフェースに新機能をもたらし、により、特定のコレクションの要素から不変のセットを作成できるようになります。

Set<T> copy = Set.copyOf(original);

Set.copyOfは非nullパラメーターを想定していることに注意してください。

9. 結論

この記事では、Javaでセットをコピーするさまざまな方法について説明しました。

いつものように、この例のソースコードをチェックしてください。これには、 Java10のソースコードも含まれます。