Javaでのセットのコピー
1. 概要
簡単に言うと、 Set は、重複する要素を含まないコレクションです。 Javaでは、SetはCollectionインターフェースを拡張するインターフェースです。
このクイックチュートリアルでは、Javaでセットをコピーするさまざまな方法について説明します。
2. コピーコンストラクタ
Set をコピーする1つの方法は、Set実装のcopyコンストラクターを使用することです。
Set<T> copy = new HashSet<>(original);
コピーコンストラクターは、既存のオブジェクトをコピーすることによって新しいオブジェクトを作成するために使用される特殊なタイプのコンストラクターです。
ここでは、特定のセットの要素を実際に複製しているわけではありません。 オブジェクト参照を新しいセットにコピーしているだけです。 そのため、1つの要素で行われた各変更は、両方のセットに影響します。
3. Set.addAll
The 設定インターフェイスには全て追加する方法
Set<T> copy = new HashSet<>();
copy.addAll(original);
4. Set.clone
SetはCollectionインターフェースを拡張するインターフェースであるため、 Setインターフェースを実装するオブジェクトを参照して、Setの別のインスタンスを作成する必要があることに注意してください。 。HashSet 、 TreeSet 、 LinkedHashSet、、 EnumSet はすべて、Set実装の例です。 X354X]。
これらすべてのSet実装には、 Cloneable インターフェイスを実装しているため、cloneメソッドがあります。
したがって、セットをコピーする別のアプローチとして、セットのcloneメソッドを呼び出すことができます。
Set<T> copy = (Set<T>) original.clone();
クローン作成は元々Object.cloneから行われることにも注意してください。セットの実装は、Objectクラスのcloneメソッドをオーバーライドします。 クローンの性質は、実際の実装によって異なります。 たとえば、 HashSet は浅いコピーしか実行しませんが、深いコピーを実行するようにコーディングすることはできます。
ご覧のとおり、クローン化されたオブジェクトを次のように型キャストする必要があります。 設定
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のStreamAPIとCollectorsを使用して、セットのクローンを作成できます。
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のソースコードも含まれます。