【Java入門】ListとSetクラスの変換・違いまとめ

皆さんはListクラスを使っていますか?
またSetクラスを使っていますか?
これらのクラスを使っていくと次のような疑問を聞くことがあります。

「ListのデータをSetクラスに変換したい」
「ListとSetはどうやって使い分けるの?」
「データ量が多い場合ListとSetどちらが高速に処理できるの?」

この記事ではそんな疑問・要望を解決しListとSetの使い分けについて学ぶ事ができます!

Setクラスとは

SetクラスListクラスと同じように扱えるため一見すると何が違うのかわかりづらいかもしれません。
しかし大きな違いがありその差を理解していないと思わぬ不具合を生むことにもなってしまいます。

Setクラスは主にHashSetTreeSetといったクラスがありますが今回はHashSetを例に用いて説明をしていきます。

まずListとSetの大きな違いについてですが「Setクラスは同じ値を持つことができない」という特性があります。

例えば次のコードを見てみましょう。

実行結果:

このようになります。
あれ?おかしいと思いませんか?

を二回書いているにも関わらず表示されている値は3つしかありません。
1は一度しか表示されないのです。

つまり、Setクラスは重複する値をいくつも持つことができないという特性があるのです。

では同じプログラムをListで書き直すとどうなるのでしょうか。
次のプログラムで実行結果も併せてみてみましょう。

実行結果:

こちらの場合では追加した通りの値が入っていることがわかります。
これでListとSetの大きな違いについて分かって頂けたのではないかと思います!

List⇔Set変換方法

では次にList⇔Setへ変換する方法について解説したいと思います。

List→Setへ変換

ListからSetの変換方法について見てみましょう。

実行結果:

HashSetをnewした際に引数にListを渡しています。
これで自動的に値が設定されて変換することができます。

上記の例を見て頂ければわかる通り、もし重複する値があったとしても自動で取り除かれます。

Set→Listへ変換

今度は逆のSetからListへ変換する場合について見ていきましょう。

実行結果:

先程のList→Setと似たようなプログラムですね。
最初にHashSetをnewして値を追加していき、ArrayListをnewした際にコンストラクタにsetを渡してあげることで自動的に値が格納されていきます。

方法としてはどちらも同じようなやり方になるため覚えやすいのではないかと思います。

応用編:多くのデータを扱う場合

この項ではさらに掘り下げて解説をしていきたいと思います。

ListクラスとSetクラスでどちらのほうが速度面で有利なのでしょうか?

今回は「追加」「値の検索」の2つの速度について解説をしていきたいと思います。

この測定ではArrayListHashSetを用いて比較をしていることご了承下さい。

List.add VS Set.add

まずはList.addのコードを示します。

次にSet.addのコードを示します。

List.addの実行結果(3回計測)

Set.addの実行結果(3回計測)

追加ではListに軍配が上がりました。
これは恐らくSet側で追加時に重複する値がないかどうかのチェックを行っているからではないかと思われます。

List.contains VS Set.contains

では次にcontainsメソッドではどうなるのでしょうか。
(Setクラスにはgetメソッドが無いため値の取得という意味で一番近いcontainsメソッドで計測をしています。)

最初にList.containsの計測に用いたコードを示します。

次にSet.containsの計測に用いたコードを示します。

List.containsの実行結果(3回計測)

Set.containsの実行結果(3回計測)

containsではSet側に軍配が上がりました。
内容としてはListに大きく差をつけています。

追加時の速度ではListが勝っていましたがこのcontainsの結果を見ると、重複しないデータの場合でかなりの量のデータを扱う場面となればSetクラスを使うのが良いのではないかと思います。

まとめ

いかがでしょうか。
今回はListからSet、SetからListの変換方法やどちらのクラスが速度面で優れているかを見ていきました。

SetはListと比べると制約がありますが問題なければSetを使うことをオススメいたします。

もし、ListとSetの比較について忘れてしまった場合はこの記事を思い出してくださいね!

LINEで送る
Pocket

最短でエンジニアを目指すなら侍エンジニア塾

cta_under_bnr

侍エンジニア塾は業界で初めてマンツーマンレッスンを始めたプログラミングスクールです。これまでの指導実績は16,000名を超え、未経験から数多くのエンジニアを輩出しています。

あなたの目的に合わせてカリキュラムを作成し、現役エンジニア講師が専属であなたの学習をサポートするため効率よく学習を進めることができますよ。

無理な勧誘などは一切ありません。まずは無料体験レッスンを受講ください。

無料体験レッスンの詳細はこちら

書いた人

オータケ

オータケ

30歳、フリーランスプログラマ。中学の頃よりプログラミングに興味を持ちゲーム開発やWebサイト構築などを経験
新しいフレームワークやライブラリに興味があり革新的な機能が含まれていると泣いて喜ぶ。

おすすめコンテンツ

あなたにぴったりなプログラミング学習プランを無料で診断!

プログラミング学習の効率を劇的に上げる学習メソッドを解説