Javaでのセットのコピー

1. 概要

簡単に言えば、_Set_は重複要素を含まないコレクションです。 Javaでは、_Set_はlink:/java-collections[_Collection_]インターフェースを拡張するインターフェースです。
このクイックチュートリアルでは、Javaでセットをコピーするさまざまな方法を説明します。

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

_Set_をコピーする1つの方法は、_Set_実装のlink:/java-constructors [コピーコンストラクター]を使用することです。
Set<T> copy = new HashSet<>(original);
*コピーコンストラクタは、https://www.baeldung.com/java-deep-copy [既存のオブジェクトのコピー]によって新しいオブジェクトを作成するために使用される特別なタイプのコンストラクタです。*
ここでは、特定のセットの要素を実際に複製していません。 オブジェクト参照を新しいセットにコピーしているだけです。 そのため、1つの要素に加えられた変更は両方のセットに影響します。

3. Set.addAll

_Set_インターフェイスには、__https://www.baeldung.com/java-set-operations [addAll] __method__があります。 __Itは、コレクション内の要素をターゲットセットに追加します。 したがって、_addAll_メソッドを使用して、既存のセットの要素を空のセットにコピーできます。
Set<T> copy = new HashSet<>();
copy.addAll(original);

4. Set.clone

_Set_は_Collection_インターフェースを拡張するインターフェースであるため、_Set_の別のインスタンスを作成するには、_Set_インターフェースを実装するオブジェクトを参照する必要があることに注意してください。* _HashSet _、_ TreeSet _、_ LinkedHashSet、_、および__EnumSet __are Javaの_Set_実装。
*これらのすべての_Set_実装には、すべてlink:/java-deep-copy[_Cloneable_]インターフェースを実装するため、クローンメソッドがあります。*
したがって、セットをコピーする別のアプローチとして、セットの_clone_メソッドを呼び出すことができます。
Set<T> copy = (Set<T>) original.clone();
*また、クローンは元々_Object.clone_からのものであることに注意しましょう。* Set実装は_Object_クラスの_clone_メソッドをオーバーライドします。 クローンの性質は実際の実装に依存します。 たとえば、_HashSet_は浅いコピーのみを行いますが、https://www.baeldung.com/java-deep-copy [ディープコピーを行う]への方法をコーディングできます。
ご覧のとおり、* _ clone_メソッドは実際に_Object_を返すため、クローンオブジェクトを_Set <T> _に型キャストする必要があります。

5. JSON

セットをコピーするもう1つの方法は、セットを_JSON String_にシリアル化し、生成された_JSON String_から新しいセットを作成することです。 *このアプローチでは、セット内のすべての要素と参照される要素はシリアル化可能でなければならず、*すべてのオブジェクトのディープコピーを実行します*。
この例では、https://www.baeldung.com/gson-serialization-guide [serialization]およびlink:/gson-deserialization-guide[deserialization]を使用してセットをコピーしますGoogleの_Gson_ライブラリのメソッド:
Gson gson = new Gson();
String jsonStr = gson.toJson(original);
Set<T> copy = gson.fromJson(jsonStr, Set.class);

6. アパッチコモンズラング

link:/java-commons-lang-3[Apache Commons Lang]には、特定のオブジェクトを複製するために使用できる特別なメソッド_clone_を提供する_SerializationUtils_クラスがあります。 このメソッドを使用してセットをコピーできます。
for (T item : original) {
    copy.add(SerializationUtils.clone(item));
}
  • _SerializationUtils.clone_は、_Serializable_クラスを拡張するためのパラメーターを期待していることに注意しましょう*。

7. _ Collectors.toSet _

または、https://www.baeldung.com/java-8-streams [Java 8の_Stream_ API]とlink:/java-8-collectors[_Collectors_]を使用してセットを複製できます。
Set<T> copy = original.stream()
    .collect(Collectors.toSet());
_Stream API_の利点の1つは、https://www.baeldung.com/java-8-streams [skips]、https://www.baeldung.com/java-stream-を使用できるため、利便性が向上することです。 filter-lambda [filters]など。

8. Java 10の使用

Java 10は_Set_インターフェイスに新しい機能を追加し、*特定のコレクションの要素から不変のセットを作成できるようにします*:
Set<T> copy = Set.copyOf(original);
  • _Set.copyOf_sは非_null_パラメーターを期待していることに注意してください。*

9. 結論

この記事では、Javaでセットをコピーするさまざまな方法を検討しました。
いつものように、https:// githubを含むhttps://github.com/eugenp/tutorials/tree/master/core-java-modules/core-java-collections-set [この例のソースコード]をご覧ください。 com / eugenp / tutorials / tree / master / core-java-modules / core-java-10 [Java 10用のもの]。